2010-12-07 30 views
90

我建立了一个NamedQuery,看起来像这样:添加IN子句列表的JPA查询

@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 

我知道我可以只建立一个字符串,并建立从整个查询,但我想避免的开销。有没有更好的方法来做到这一点?

相关问题:如果列表非常大,是否有任何建立这样的查询的好方法?

回答

137

当使用IN与集合值参数不需要(...)

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

就是这样,谢谢。 – AlanObject 2010-12-08 16:19:38

+6

不......我的情况正好相反。如果我使用:inclList,那么它不起作用。如果我使用IN(:inclList),那么它工作。 – 2012-11-24 10:27:53

+1

另请注意提及:您的参数的类型必须是对象的集合(而非数组)。对象必须与字段的类型匹配。 .toString()不能替代类String – dube 2014-03-21 10:47:12

26
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

53

正确的JPA查询格式为我工作将是:

el.name IN :inclList 

如果您使用的是旧版本的Hibernate作为您的公关ovider你必须写:

el.name IN (:inclList) 

但是这是一个错误(HHH-5126)(编辑:已经通过现在已经得到解决)。

5

您必须转换到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();