将IN子句列表添加到JPA查询中

Ala*_*ect 116 java jpa jpql

我已经构建了一个看起来像这样的NamedQuery:

@NamedQuery(name = "EventLog.viewDatesInclude",
        query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND "
        + "el.timeMark <= :dateTo AND "
        + "el.name IN (:inclList)")
Run Code Online (Sandbox Code Playgroud)

我想要做的是填写参数: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
Run Code Online (Sandbox Code Playgroud)

我知道我可以构建一个字符串并从中构建整个Query,但我想避免开销.有没有更好的方法呢?

相关问题:如果List非常大,有没有什么好的方法来构建这样的查询?

axt*_*avt 173

使用IN集合值参数时,您不需要(...):

@NamedQuery(name = "EventLog.viewDatesInclude", 
    query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND " 
    + "el.timeMark <= :dateTo AND " 
    + "el.name IN :inclList") 
Run Code Online (Sandbox Code Playgroud)

  • 不,我的情况恰恰相反.如果我使用:inclList然后它不工作.如果我使用IN(:inclList),那么它的工作原理. (6认同)
  • 对于相关问题:如果列表非常大,则实施可能会受到限制。例如甲骨文11g。最大限度。可以有 1000 个列表元素作为参数。解决方法是将列表切入子列表并收集结果。JPA 本身不限制列表大小。 (4认同)
  • 另请注意:您的参数类型必须是对象的集合(而不是数组)。对象必须与字段的类型匹配。.toString() 不能替代类 String (2认同)
  • 我认为这已经随着Hibernate的版本而改变了,据我所知,当使用IN时没有对变量进行限制时我遇到了错误.奇怪,如果它不向后兼容.. (2认同)

小智 74

正确的JPA查询格式为:

el.name IN :inclList
Run Code Online (Sandbox Code Playgroud)

如果你使用旧版本的Hibernate作为你的提供者,你必须写:

el.name IN (:inclList)
Run Code Online (Sandbox Code Playgroud)

但这是一个错误(HHH-5126)(编辑:现在已经解决了).

  • 感谢您区分旧版本的Hibernate use() (5认同)

use*_*134 29

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();
    }
Run Code Online (Sandbox Code Playgroud)

适用于JPA 2,Jboss 7.0.2


小智 8

您必须转换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();
Run Code Online (Sandbox Code Playgroud)