如何在 NamedQuery 中编写 NamedQuery hasrsine 公式?

Posted

技术标签:

【中文标题】如何在 NamedQuery 中编写 NamedQuery hasrsine 公式?【英文标题】:How to write NamedQuery haversine formula in NamedQuery? 【发布时间】:2012-07-25 19:35:41 【问题描述】:

我想以 NamedQuery 的形式在 haversine 公式的查询下运行,但我不知道如何更正它。

set @orig_lat = 37.334542;
set @orig_lon = -121.890821;
set @dist = 10;

select  *,
        3956 * 2 * ASIN(SQRT(POWER(SIN((@orig_lat - abs(mlatitude)) * pi() / 180 / 2), 2) 
          + COS(@orig_lat * pi() / 180) * COS(abs(mlatitude) * pi() / 180) * POWER(SIN((@orig_lon - mlogitude) * pi() / 180 / 2), 2))) as distance
from user_gps_location
having distance < @dist
ORDER BY distance

我在 mysql 中运行这个查询,它对我来说很好,但是当我在下面的查询中写为 NamedQuery 时,它给了我错误:

UserGpsLocation users = (UserGpsLocation)em.createQuery("select (3956*2*ASIN(SQRT(POWER(SIN((?1-abs(u.mlatitude))*pi()/180/2),2)+COS(?1*pi()/180) * COS(abs(u.mlatitude)* pi()/180) *POWER(SIN((?2 -u.mlogitude)* pi()/180/2),2)))) as distance from UserGpsLocation u having distance < :dist ORDER BY distance")
      .setParameter(1, mlatitude)
      .setParameter(2, mlogitude)
      .setParameter("dist", 10)
      .getResultList();

例外:

javax.servlet.ServletException: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Syntax error parsing the query [select (3956*2*ASIN(SQRT(POWER(SIN((?1-abs(u.mlatitude))*pi()/180/2),2)+COS(?1*pi()/180) * COS(abs(u.mlatitude)* pi()/180) *POWER(SIN((?2 -u.mlogitude)* pi()/180/2),2)))) as distance from UserGpsLocation u having distance < :dist ORDER BY distance], line 1, column 19: unexpected token [(].
Internal Exception: NoViableAltException(83@[()* loopback of 383:9: (d= DOT right= attribute )*])

谁能帮助我并告诉我它有什么问题?

【问题讨论】:

如果您重新标记可能会有所帮助,例如 [sql] 到 [java]? 【参考方案1】:

终于找到解决办法了。我没有使用 createQuery,而是使用 createNativeQuery 解决了我的问题。

【讨论】:

以上是关于如何在 NamedQuery 中编写 NamedQuery hasrsine 公式?的主要内容,如果未能解决你的问题,请参考以下文章

在@NamedQuery (JPA QL 1.0) 中设置为空的参数

如何按在 sql/namedQuery 中找到的关键字数量排序

JPA:如何将@NamedStoredProcedureQuery 与@NamedQuery 结合起来执行周边搜索?

如何向 NamedQuery/MappedSelect 添加预取?

使用 NamedQuery 进行内部联接?

JPA 计数 NamedQuery