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
这是一个简化的查询,它将重现错误:
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