向 JPA 查询添加 IN 子句 List

我已经构建了一个如下所示的 NamedQuery:

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

我想要做的是用一个项目列表而不是一个项目来填充参数: incList。例如,如果我有一个 new List<String>() { "a", "b", "c" },那么我如何在: incList 参数中得到它?它只能让我编码一个字符串。例如:

setParameter("inclList", "a") // works


setParameter("inclList", "a, b") // does not work


setParameter("inclList", "'a', 'b'") // does not work


setParameter("inclList", list) // throws an exception

我知道我可以只构建一个字符串并从中构建整个查询,但是我想避免开销。还有更好的办法吗?

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

336550 次浏览

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

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

正确的 JPA 查询格式应该是:

el.name IN :inclList

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

el.name IN (:inclList)

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

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