Вопрос

Я являюсь разработчиком приложений 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 - это просто индекс позиционного параметра.

Дополнительные источники

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top