2015-07-27 1 views
2

У меня был сайт, на котором хранятся данные моих сайтов с широтой и долготой.PostgreSQL 9.4, используйте earth_distance в моей JPA namedQuery

ozssc=> \d site; 
...... 
site_latitude   | double precision   | 
site_longitude  | double precision   | 
...... 

Я добавил к моему PostgreSQL серверу 9.4.3

CREATE EXTENSION cube; 
CREATE EXTENSION earthdistance; 

Есть все функции были добавлены в моей базе данных, и я изменил владельца функции на мой логин пользователя.

Когда я попытался Psql на мой сервер и выполнить:

ozssc=> select * from site s where earth_box('-28.175613','153.52578399999993',100000) @> ll_to_earth(s.site_latitude,s.site_longitude); 
ERROR: function earth_box(unknown, unknown, integer) does not exist 
LINE 1: select * from site s where earth_box('-28.175613','153.52578... 
          ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 

и когда я попытался поставить earth_box функцию в моем имени запроса в JPA, как:

@NamedQuery(name = "SiteEntity.findByEarthDistance", query = "SELECT s FROM SiteEntity s WHERE earth_box((ll_to_earth(:positionLatitude, :positionLongitude), :range) @> ll_to_earth(s.siteLatitude,s.siteLongitude))"), 

Мой IntelliJ жалуется есть не функция сопоставление ??

Когда я попытался развернуть мое JavaEE приложение к моему WebLogic 12c, я нашел ошибку, как:

Message icon - Error An error occurred during activation of changes, please see the log for details. 
Message icon - Error Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.JPQLException Exception Description: Syntax error parsing [SELECT s FROM SiteEntity s WHERE earth_box((ll_to_earth(:positionLatitude, :positionLongitude), :range) > ll_to_earth(s.siteLatitude,s.siteLongitude))]. [33, 151] The expression is not a valid conditional expression. 
Message icon - Error Substituted for missing class Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd) - org.eclipse.persistence.exceptions.JPQLException Exception Description: Syntax error parsing [SELECT s FROM SiteEntity s WHERE earth_box((ll_to_earth(:positionLatitude, :positionLongitude), :range) > ll_to_earth(s.siteLatitude,s.siteLongitude))]. [33, 151] The expression is not a valid conditional expression. 

Я потерял направление сейчас, Может ли один помочь мне пожалуйста !!

Редактировать Опять

Я нашел там должна быть некоторые ошибки в earth_box функции PostgreSQL 9.4, она не всегда может получить правильный набор результатов, я должен изменить его earth_distance функции и использовать несколько проецирование выбора для сделать его хорошо работать, более новый namedQuery как:

@NamedQuery(name = "SiteEntity.findBySiteLNR", query = "SELECT s, FUNC('earth_distance', FUNC('ll_to_earth',:positionLatitude, :positionLongitude), FUNC('ll_to_earth',s.siteLatitude,s.siteLongitude)) AS dfcl " + 
      "FROM SiteEntity s WHERE dfcl < :range ORDER BY dfcl"), 

Я не использовал спящий режим, вместо того, я использую EclipseLink и JPA 2.1, EJB контейнер Weblogic 12С, спецификация EJB 3.1.

ответ

1

Примерно через 4 часа, столкнувшись с проблемой, я обнаружил решения. В основном, так как это вызов функции из JPA, некоторые трюки должны знать.

PSQL заявление как:

select * from site s where earth_box(ll_to_earth(-28.175613,153.52578399999993),100000) @> ll_to_earth(s.site_latitude,s.site_longitude); 

И JPA namedQuery как:

@NamedQuery(name = "SiteEntity.findByEarthDistance", query = "SELECT s FROM SiteEntity s WHERE FUNC('earth_box', FUNC('ll_to_earth',:positionLatitude, :positionLongitude), :range) > FUNC('ll_to_earth',s.siteLatitude,s.siteLongitude)"), 

вложенный вызов функции в JPA тоже работает, спасибо!

0

Я думаю, что СОВЕТ сообщает все: вам нужно добавить явные типы приведения.

Вы можете сделать это, добавив двойную точку с запятой и тип, в который вы хотите вставить его. То есть

'-28.175613'::text 

Или что-то еще, что функция ожидает.

0

Настоятельно рекомендуется использовать FUNCTION вместо FUNC (ранее реализация: http://www.eclipse.org/eclipselink/documentation/2.6/jpa/extensions/jpql.htm#func). EclipseLink поддерживает порядок и группу с помощью FUNCTIONS, тогда как FUNC не работает.

@NamedQuery(name = "SiteEntity.findByEarthDistance", query = "SELECT s FROM SiteEntity s WHERE FUNCTION('earth_box', FUNCTION('ll_to_earth',:positionLatitude, :positionLongitude), :range) > FUNCTION('ll_to_earth',s.siteLatitude,s.siteLongitude)") 
Смежные вопросы