JPA中的三角函数

时间:2015-11-23 00:30:34

标签: java sql hibernate jpa

我在JPA中运行以下查询:

SELECT c, acos(sin(:lat) * sin(c.latitude) + cos(:lat) * cos(c.latitude) * cos(c.longitude - :lng)) as dist FROM Item c JOIN c.dish.dishtags tags WHERE tags IN :tags AND (c.latitude >= :lat1 AND c.latitude <= :lat2) AND (c.longitude >= :lng1 AND c.longitude <= :lng2) AND dist <= :maxdist

但我得到以下例外:

[27, 42] The right expression is not an arithmetic expression.
[45, 98] The right expression is not an arithmetic expression.
[13, 14] The SELECT clause has 'acos' and '(sin(:lat) * sin(c.latitude) + cos(:lat) * cos(c.latitude) * cos(c.longitude - :lng)) AS dist' that are not separated by a comma.

我搜索了一下,似乎有些人建议在使用三角函数时使用本机查询,但这对我来说真的很烦,因为我必须修改已经用JPA编写的大量查询。所以我问:有没有办法修改查询以使其工作?如果JPA框架不支持常见的三角函数,那将是非常奇怪的。 谢谢。

1 个答案:

答案 0 :(得分:2)

JPQL不支持这些trig函数(JDO支持FWIW)。某些实现可能支持它们作为供应商扩展。我知道DataNucleus JPA does,但其他人也可以。

或者使用JPQL标准,使用(long winded)语法,如

function('sin', :lat)

虽然这可能会破坏数据库的独立性,但这应该是您项目的一个问题。