Как использовать подготовленное утверждение в JPA
-
21-12-2019 - |
Вопрос
Я являюсь разработчиком приложений Play Framework. Я использую метод CreateNativeQuery в JPA.В этом примере я хочу использовать подготовленный оператор.Пожалуйста, кто-нибудь поможет мне? Вот код без JPA.Мне нужна помощь, чтобы преобразовать его в подготовленное утверждение.
Query query = JPA.em().createNativeQuery("select count(*) from truck t inner join" +
"box b where t.truck_id=b.truck_id and t.shipment_upc='" + code + "'");
BigInteger val = (BigInteger)query.getSingleResult();
System.out.println(val);
. Решение
Query query = JPA.em().createNativeQuery("select count(*) from truck t inner join box b where t.truck_id=b.truck_id and t.shipment_upc=:code");
query.setParameter("code", code);
. Другие советы
Краткое резюме
Вам нужно использовать параметры запроса здесь, но поскольку вы используете нативный запрос , вы можете быть ограничены в ваших параметрах по сравнению с JPQL.
Состояние мира
Вы можете быть Ограничено limited paramestal paraments :
JPA не требует собственных запросов поддержки именованных параметров, но некоторые провайдеры JPA могут
Реализация Hibernate jpa Поддержка с именованными параметрами :
Нативные запросы SQL-запросы поддержки, а также именованные параметры
Решение
Hibernate
kumar range kumar sao показывает, как Решите это с помощью именованных параметров. Это возможно, по крайней мере, в гибернации.
Я повторю это здесь ради сравнения:
Query query = JPA.em().createNativeQuery(
"SELECT COUNT(*) "+
"FROM truck AS t "+
"INNER JOIN box b "+
"WHERE t.truck_id = b.truck_id "+
"AND t.shipment_upc = :code"
);
query.setParameter("code", code);
.
универсальный jpa (включая EclipseLink)
Я обнаружил, что с EclipseLink (2.5.1) названные параметры не поддерживались.
вместо этого становится необходимым использование позиционных параметров. Они могут быть выражены двумя способами - явно и неявно.
Явный индекс
Отметьте параметр, используя ?1
(или какое-то другое число). Этот индекс можно использовать для уникального идентификации этого конкретного параметра в вашем запросе.
Query query = JPA.em().createNativeQuery(
"SELECT COUNT(*) "+
"FROM truck AS t "+
"INNER JOIN box b "+
"WHERE t.truck_id = b.truck_id "+
"AND t.shipment_upc = ?1"
);
query.setParameter(1, code);
.
Неявный индекс
Отметьте параметр, используя только ?
. Его индекс будет основан на последовательности всех параметров, участвующих в вашей строке запроса.
Query query = JPA.em().createNativeQuery(
"SELECT COUNT(*) "+
"FROM truck AS t "+
"INNER JOIN box b "+
"WHERE t.truck_id = b.truck_id "+
"AND t.shipment_upc = ?"
);
query.setParameter(1, code);
.
Примечания
Соблюдайте, что:
- .
- позиционные параметры 1-индексированы.
- Ключ в карте параметра
Query
- это просто индекс позиционного параметра.