Родные запросы JPA / Hibernate не распознают параметры

Я использую Hibernate / JPA для выполнения собственных запросов PostGIS. Проблема с этими запросами заключается в том, что им нужны параметры, которые не относятся к classической форме X = ‘value’.

Например, следующие краны строк

String queryString = "select * from Cell c where ST_DWithin(c.shape, SetSRID(ST_GeomFromEWKT('POINT(:lon :lat)'),4326), 0.1)"; Query query = Cell.em().createNativeQuery(queryString, Cell.class); query.setParameter("lon", longitude); query.setParameter("lat", latitude); play.exceptions.JavaExecutionException: org.hibernate.QueryParameterException: could not locate named parameter [lon] at play.mvc.ActionInvoker.invoke(ActionInvoker.java:259) at Invocation.HTTP Request(Play!) Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryParameterException: could not locate named parameter [lon] at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:358) 

Однако следующий запрос работает:

 String queryString = String.format("select * from Cell c where ST_DWithin(c.shape, SetSRID(ST_GeomFromEWKT('POINT(%f %f)'),4326), 0.1)", longitude, latitude); Query query = Cell.em().createNativeQuery(queryString, Cell.class); 

(но он подвержен SQL-инъекциям …)

Кто-нибудь знает, как использовать setParameter() в этом случае?

    Использование именованных параметров не определено для собственных запросов. Из спецификации JPA (раздел 3.6.3 Именованные параметры ):

    Именованные параметры соответствуют правилам для идентификаторов, определенных в разделе 4.4.1. Использование именованных параметров применяется к языку запросов Java Persistence и не определяется для собственных запросов. Только привязка позиционного параметра может быть портативно использована для собственных запросов .

    Поэтому попробуйте следующее:

     String queryString = "select * from Cell c where ST_DWithin(c.shape, SetSRID(ST_GeomFromEWKT('POINT(?1 ?2)'),4326), 0.1)"; Query query = Cell.em().createNativeQuery(queryString, Cell.class); query.setParameter(1, longitude); query.setParameter(2, latitude); 

    Обратите внимание, что в JPA> = 2.0 вы можете использовать именованные параметры в собственных запросах.

    Возможно, вы можете заменить

     'POINT(:lon :lat)' 

    с

     'POINT(' || :lon || ' ' || :lat || ')' 

    Таким образом, параметры находятся за пределами константных строк и должны быть распознаны парсером запросов.

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

     String queryString = "select * from Cell c where ST_DWithin(c.shape, SetSRID(ST_GeomFromEWKT('POINT(? ?)'),4326), 0.1)"; Query query = Cell.em().createNativeQuery(queryString, Cell.class); query.setParameter(1, longitude); query.setParameter(2, latitude); 

    Итак, идея заключалась в том, чтобы использовать конкатенационный трюк, предложенный Йорном Хорстманом, чтобы заставить postgres распознавать параметры. Следующий код работает:

     String queryString = "select * from Cell c where ST_DWithin(c.shape, SetSRID(ST_GeomFromEWKT('POINT(' || :lon || ' ' || :lat || ')'),4326), 0.2)"; Query query = Cell.em().createNativeQuery(queryString, Cell.class); query.setParameter("lon", longitude); query.setParameter("lat", latitude); 

    Большое спасибо за ваши ответы!

    Вы также можете избавиться от всего

     ST_GeomFromEWKT('POINT(' || :lon || ' ' || :lat || ')') 

    позвоните и замените его

     ST_Point(:lon,:lat) 

    Тогда вам не нужно беспокоиться о котировках.

    Ответ Паскаля правильный, но … Как ваше решение SQL-инъекции подвержено? Если вы используете String.format и parmater типа %f в вашем примере, то ничего, кроме числа, вызывает java.util.IllegalFormatConversionException. Нет значения пропускной способности, например «xxx» ИЛИ 1 = 1 – ».

    Будьте осторожны, используя %s в String.format – это SQL-инъекция.

    Я столкнулся с подобной проблемой. Я использовал собственный запрос в репозитории с? 1. Он разрешил его, окружая параметр вокруг скобок следующим образом.

     SELECT * FROM XYZ WHERE ABC = (?1) 

    http://javageneralist.blogspot.com/2011/06/jpa-style-positional-param-was-not.html

    Interesting Posts

    Изменение раскладки клавиатуры win7 с экрана входа в систему

    Как установить расширенные свойства файла?

    Добавить новое поле в каждый документ в коллекции MongoDB

    Как управлять индексированием поля в lucene 4.0

    Ошибка Eclipse: «Не удалось подключиться к удаленной виртуальной машине»

    WPF – Настройте фокус при нажатии кнопки – Без кода

    Каков правильный способ использования функции rand () в C ++?

    SQLITE_BUSY Файл базы данных заблокирован (firebase database заблокирована) в калитки

    Легкий способ запуска коммутатора через USB?

    Windows 7 больше не обнаруживает запоминающие устройства USB

    Golang: создание константного типа и ограничение значений типа

    Почему я не могу использовать интерфейс с явным оператором?

    Как запустить Mac OS X в Windows Virtual PC?

    Как вы добавляете пользовательский интерфейс внутри ячеек в электронную таблицу google с помощью сценария приложения?

    Устаревшая проблема с ManagedQuery ()

    Давайте будем гением компьютера.