HQL在case子句

时间:2019-02-06 16:56:19

标签: hibernate hql hibernate-spatial

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

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 Query Language语法。

我没有在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。

1 个答案:

答案 0 :(得分:1)

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