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

我build立了一个如下所示的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参数? 它只能让我编一个string。 例如:

 setParameter("inclList", "a") // works setParameter("inclList", "a, b") // does not work setParameter("inclList", "'a', 'b'") // does not work setParameter("inclList", list) // throws an exception 

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

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

当使用带有集合值参数的IN ,不需要(...)

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

正确的JPA查询格式是:

 el.name IN :inclList 

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

 el.name IN (:inclList) 

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

 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

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