2010-01-14 68 views
1

我有经度和纬度的实体,我想选择那些最接近给定点的那些。JPQL根据纬度和经度得到最近的记录

我发现这个例子,看起来像它会工作

SELECT *, 
    SQRT(POW((69.1 * (locations.latitude - 27.950898)) , 2) + 
    POW((53 * (locations.longitude - -82.461517)), 2)) AS distance 
FROM locations 
ORDER BY distance ASC 
LIMIT 5 

但我宁愿与JPQL做到这一点,因为我有一大堆的其他连接等,感觉更容易在JPQL做本地查询,而不是。

当我尝试这样的事情时,JPA抱怨SQRT令牌。

SELECT DISTINCT p, SQRT(....) AS distance, FROM Place p .... ORDER BY distance ASC 

任何人都已经知道如何编写一个查询,或者也许另一个更好的办法?

谢谢! /奥斯卡

回答

1

据我所知,从研究中可以看出,试用和错误JPQL根本没有装备来处理这种情况。我不得不将我的查询重写为本机。

0

The JPQL language reference说:

functions_returning_numerics :: = ABS(simple_arithmetic_expression)| SQRT(simple_arithmetic_expression)| MOD(simple_arithmetic_expression,simple_arithmetic_expression)| SIZE(collection_valued_pa​​th_expression)

因此,您没有POW

您可以安全地使用本机查询。

但是,我更喜欢的方法是在不进行计算的情况下进行查询,然后对代码中的结果进行计算。它不应该是一个很大的性能危险。

+0

由于Oskar只需要2的幂就可以在没有POW的情况下进行查询,尽管它会是罗嗦的。奇怪的是,它抱怨SQRT。我会试验它。 – rayd09 2010-01-16 09:16:35

+0

想想吧,你甚至不需要SQRT来做你想要的查询。您选择并按距离的平方排序,不要取平方根,直到得到一小组结果。无论您使用距离的平方还是距离本身,排序都是相同的。 – rayd09 2010-01-16 09:59:27

+0

好主意,POW可以扩展,SQRT在比较中无关紧要。问题是,如果将它们放在FROM之前,我就无法进行任何计算。我不确定JPQL是如何工作的,如果可能的话。最坏的情况我想我必须回退到原生SQL。 – Oskar 2010-01-18 04:06:03