HQL дает «неожиданный узел AST (» в предложении case - PullRequest
0 голосов
/ 06 февраля 2019

Это упрощенный запрос , который выдаст ошибку:

SELECT 
 CASE 
     WHEN contains(buffer(r.polygon, 0.009), h.latlng) THEN 1 
     ELSE 0 
 END as near 
FROM Region r, House h 
WHERE r.id = 732 AND h.id = 892877180

Выполнение session.createQuery(hql) приведет к выдаче QuerySyntaxException: unexpected AST node: ( near line 1, column 32.Столбец 32 - это первые открывающие круглые скобки, которые появляются сразу после contains.

Поскольку базовая база данных - MySQL, и этот HQL также является допустимым MySQL, я протестировал точно такой же запрос к базе данных MySQL, и он работал нормально.,Таким образом, я предполагаю, что проблема основана на синтаксисе языка запросов Hibernate.

Я не нашел нигде в документации Hibernate, утверждающей, что использование функций внутри предложения CASE WHEN ... THEN не поддерживается, но и не сообщается об ошибке по этой проблеме..

Обратите внимание, что при отсутствии предложения CASE все работает нормально:

SELECT contains(buffer(r.polygon, 0.009), h.latlng) as near 
FROM Region r, House h 
WHERE r.id = 732 AND h.id = 892877180

Я использую Hibernate ORM 4.3.11, Hibernate Spatial 4.3 и MySQL 5.6.34 в UbuntuLinux 18.04.1.

1 Ответ

0 голосов
/ 07 февраля 2019

Я думаю, это потому, что синтаксический анализатор HQL ожидает реляционное выражение в CASE WHEN -клазе, а не просто любое логическое выражение.Я подозреваю, что это сработает:

SELECT 
 CASE 
   WHEN contains(buffer(r.polygon, 0.009), h.latlng) = TRUE THEN 1 
 ELSE 0 
END as near  
FROM Region r, House h 
WHERE r.id = 732 AND h.id = 892877180
...