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

Java 将IN子句列表添加到JPA查询,java,jpa,jpql,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)") 我知道我可以构建一个字符串并从

我构建了一个NamedQuery,如下所示:

@NamedQuery(name = "EventLog.viewDatesInclude",
        query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND "
        + "el.timeMark <= :dateTo AND "
        + "el.name IN (:inclList)")
我知道我可以构建一个字符串并从中构建整个查询,但我希望避免开销。有更好的方法吗


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

在中使用集合值参数时,您不需要
(…)

@NamedQuery(name=“EventLog.viewDatesInclude”,
query=“从事件日志el中选择el,其中el.timeMark>=:dateFrom和”
+“el.timeMark
public List getDealInfos(List dealid){
String queryStr=“选择新的com.admin.entity.DealInfo(deal.url、deal.url、deal.url、deal.url、deal.price、deal.value)”+“来自deal AS deal,其中deal.id位于:inclist中”;
TypedQuery query=em.createQuery(queryStr,DealInfo.class);
setParameter(“inclist”,dealId);
返回query.getResultList();
}

适用于我的JPA 2、Jboss 7.0.2

正确的JPA查询格式为:

el.name IN :inclList
如果您使用较旧版本的Hibernate作为提供程序,则必须编写:

el.name IN (:inclList)

但这是一个bug()(编辑:现在已经解决了)。

您必须转换为
列表,如下所示:

    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();
String[]valores=hierarquia.split(“.”);
List lista=Arrays.asList(valores);
String jpqlQuery=“选择一个”+
“来自AcessoScr a”+
“其中a.scr IN:param”;
Query Query=getEntityManager().createQuery(jpqlQuery,acessscr.class);
setParameter(“param”,lista);
List acessos=query.getResultList();

Nope…我的情况正好相反。如果我使用:inclList,则它不起作用。如果我在(:inclList)中使用,则它起作用。另请注意:参数的类型必须是对象的集合(而不是数组)。对象必须与字段的类型相匹配。.toString()不是StringClass的替代品我想这是随着Hibernate版本的改变而改变的,据我记忆所及,当在中使用时,我在变量周围没有定论时出现了一个错误。奇怪的是,如果它不向后兼容..这确实是一个Hibernate错误(需要括号)3.6.1中针对相关问题修正了这一点:如果列表非常大,则在实现中可能存在限制。例如,oracle 11g。最多可以使用1000个列表元素作为参数。解决方法是将列表切分为子列表并收集结果。JPA本身不限制列表大小。感谢您区分较旧的列表Hibernate版本使用()Thx这个答案是最好的答案。这是的一个副本,但这个线程提供了有用的答案。
el.name IN :inclList
el.name IN (:inclList)
    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();