Как я могу использовать JPQL в NamedQuery для создания объекта с вычисляемым переходным атрибутом?

У меня есть оператор SQL:

SELECT x.SPEED, (6371 * acos(cos(radians(16.65555))) 
                 * cos(radians(LATITUDE)) * cos(radians(LONGITUDE) - radians(54.55555)) 
                 + sin(radians(16.65555)) * sin(radians(LATITUDE))) AS dist 
FROM MY_TABLE x 
HAVING dist <= 50 
ORDER BY dist

Как я могу поместить это в NamedQuery в классе объектов Java таким образом, чтобы вычисляемое значение задавалось в этом объекте как переходный атрибут с именем distance?

На данный момент я пробовал это:

SELECT vsle, 
       (:distance_unit * FUNC('acos', FUNC('cos', FUNC('radians', :latitude)) * 
       FUNC('cos', FUNC('radians', vsle.geoPosition.latitude)) * 
       FUNC('cos', FUNC('radians', vsle.geoPosition.longitude) - FUNC('radians', :longitude)) + 
       FUNC('sin', FUNC('radians', :latitude)) * FUNC('sin', FUNC('radians', vsle.geoPosition.latitude)) ) ) 
AS distance 
FROM VehicleStateLogEntity vsle 
WHERE (distance <= :radius)

но это не удается с java.lang.NullPointerException. Похоже, что к вычисляемому значению нельзя получить доступ через присвоенное ему имя distance.


person du-it    schedule 03.11.2014    source источник


Ответы (1)


Я нашел способ построить действительный JPQL:

SELECT vsle, 
   (:distance_unit * FUNC('acos', FUNC('cos', FUNC('radians', :latitude)) * 
   FUNC('cos', FUNC('radians', vsle.geoPosition.latitude)) * 
   FUNC('cos', FUNC('radians', vsle.geoPosition.longitude) - FUNC('radians', :longitude)) + 
   FUNC('sin', FUNC('radians', :latitude)) * FUNC('sin', FUNC('radians', vsle.geoPosition.latitude)) ) ) AS distance 
FROM VehicleStateLogEntity vsle 
WHERE ((:distance_unit * FUNC('acos', FUNC('cos', FUNC('radians', :latitude)) * 
   FUNC('cos', FUNC('radians', vsle.geoPosition.latitude)) * 
   FUNC('cos', FUNC('radians', vsle.geoPosition.longitude) - FUNC('radians', :longitude)) + 
   FUNC('sin', FUNC('radians', :latitude)) * FUNC('sin', FUNC('radians', vsle.geoPosition.latitude)) ) )<= :radius) 
ORDER BY distance

Странно, что я не могу получить доступ к псевдониму distance в предложении SELECT, но могу в предложении ORDER BY.

person du-it    schedule 20.11.2014
comment
Работал как шарм. Потрясающие. Примечание. Distance_unit должно быть 111,045, если вы хотите указать свои расстояния в километрах, и 69,0, если вы хотите, чтобы они были в милях. - person Sacky San; 26.08.2017
comment
Коррекция. Distance_unit должно быть 6371, если вы хотите указать свои расстояния в километрах, и 3959, если вы хотите, чтобы они были в милях. Подробная документация по картам Google по этому вопросу находится по адресу developers.google.com/maps/solutions/store-locator/ - person Sacky San; 28.08.2017