Добавление списка предложений 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();