我想在haversine公式的查询下运行为NamedQuery,但我不知道如何纠正它。
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 )*])
谁能帮助我,告诉我这是怎么回事?
终于能够找到解决方案。我使用createNativeQuery代替createQuery,它解决了我的问题。