2012-07-25 2 views
1

아래 haversine 수식을 NamedQuery로 실행하고 싶지만이를 수정하는 방법을 모르겠습니다.NamedQuery에서 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([email protected][()* loopback of 383:9: (d= DOT right= attribute)*]) 

수있는 사람을 도와 주시고 무엇이 잘못되었는지 말해 주시겠습니까?

+0

[sql]을 (를) [java]로 다시 태그하면 도움이 될 수 있습니까? – Josien

답변

0

마지막으로 해결책을 찾을 수 있습니다. createQuery 대신 createNativeQuery를 사용하여 문제를 해결했습니다.

관련 문제