Добавление списка предложений IN в запрос JPA
Я создал NamedQuery, который выглядит так:
@NamedQuery(name = "EventLog.viewDatesInclude",
query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND "
+ "el.timeMark <= :dateTo AND "
+ "el.name IN (:inclList)")
Что я хочу сделать, это указать параметр: inclList со списком элементов вместо одного элемента. Например, если у меня есть new List<String>() { "a", "b", "c" }
, как я могу получить это в параметре: inclList? Это позволяет мне кодифицировать одну строку. Например:
setParameter("inclList", "a") // works
setParameter("inclList", "a, b") // does not work
setParameter("inclList", "'a', 'b'") // does not work
setParameter("inclList", list) // throws an exception
Я знаю, что могу просто построить строку и построить из нее весь запрос, но я хотел избежать накладных расходов. Есть ли лучший способ сделать это?
Связанный вопрос: если Список очень велик, есть ли хороший способ построения такого запроса?
Ответы
Ответ 1
При использовании IN
с параметром, содержащим коллекцию, вам не нужно (...)
:
@NamedQuery(name = "EventLog.viewDatesInclude",
query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND "
+ "el.timeMark <= :dateTo AND "
+ "el.name IN :inclList")
Ответ 2
Правильный формат запросов JPA будет:
el.name IN :inclList
Если вы используете более старую версию Hibernate в качестве своего провайдера, вам нужно написать:
el.name IN (:inclList)
но это ошибка (HHH-5126) (EDIT: это уже разрешено).
Ответ 3
public List<DealInfo> getDealInfos(List<String> dealIds) {
String queryStr = "SELECT NEW com.admin.entity.DealInfo(deal.url, deal.url, deal.url, deal.url, deal.price, deal.value) " + "FROM Deal AS deal where deal.id in :inclList";
TypedQuery<DealInfo> query = em.createQuery(queryStr, DealInfo.class);
query.setParameter("inclList", dealIds);
return query.getResultList();
}
Работает для меня с JPA 2, Jboss 7.0.2
Ответ 4
Вы должны преобразовать в List
, как показано ниже:
String[] valores = hierarquia.split(".");
List<String> lista = Arrays.asList(valores);
String jpqlQuery = "SELECT a " +
"FROM AcessoScr a " +
"WHERE a.scr IN :param ";
Query query = getEntityManager().createQuery(jpqlQuery, AcessoScr.class);
query.setParameter("param", lista);
List<AcessoScr> acessos = query.getResultList();