这是一个简化查询,将重现该错误:
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。
答案 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