Comment écrire une requête nommée Haverine Formula dans la requête nommée?
-
11-12-2019 - |
Question
Je veux courir sous la requête de la formule de Haversine comme nomméeQuery mais je ne sais pas comment le corriger.
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
Je gère cette requête dans mysql et ça marche bien pour moi, mais quand j'écris ci-dessous la requête comme nommée, cela me donne une erreur:
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();
Exception:
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 )*])
Quelqu'un peut-il m'aider et me dire ce qui ne va pas avec ça?
La solution
enfin capable de trouver une solution.Au lieu de CreativeRery, j'ai utilisé CreateNativeQuery et cela résolvez mon problème.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow