HQL 在 case 子句中给出 "unnexpected AST node ("

HQL gives "unnexpected AST node (" within case clause

这是一个简化的查询,它将重现错误:

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

我在 Ubuntu Linux 18.04.1.

上使用 Hibernate ORM 4.3.11、Hibernate Spatial 4.3 和 MySQL 5.6.34

我认为这是因为 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