JPA Criteria API IN表达式参数列表

是否有可能在Criteria API .in表达式中使用参数列表?

我有这样的事情:

    List list = new ArrayList();
    list.add((long)1);
    list.add((long)2);
    list.add((long)3);


CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery criteriaQuery = cb.createQuery(Bewerbung.class);
Root bewerbung = criteriaQuery.from(Bewerbung.class);

criteriaQuery.select(bewerbung).where(
cb.in(bewerbung.get(Bewerbung_.bewerberNummer)).value(list);

return em.createQuery(criteriaQuery).getResultList();

表达式 .value(list)不起作用,因为value()需要long类型的参数而不是列表。 在我的情况下,不可能使用子查询。 任何人都可以帮我解决这个问题吗?

0
额外 编辑
意见: 2

2 答案

cb.isTrue(bewerbung.get(Bewerbung_.bewerberNummer).in(list));

应该做的伎俩,AFAIK。

0
额外
太好了,谢谢你的工作,但我使用Hibernate,看起来Hibernate不支持将空收集作为参数javax.persistence.criteria.Expression“in”方法参数。请参阅 lists.jboss.org/pipermail/hibernate-issues/2011 - 12月/…
额外 作者 user1414341,
AFAIK,没有人支持他们。万一空列表作为参数传递时,您应该短路查询。
额外 作者 JB Nizet,
非常感谢你@JBNizet
额外 作者 ozgur,
我发现这个表达式(包装在isTrue中)在EclipseLink 2.6.2中引发异常PREDICATE_PASSED_TO_EVALUATION,但没有isTrue包装在我的示例中完美地作为谓词,可能是因为“in”返回Predicate对象。
额外 作者 Miklos Krivan,

无需使用 CriteriaBuilder#isTrue 。这应该足够了:

criteriaQuery.select(bewerbung)
             .where(bewerbung.get(Bewerbung_.bewerberNummer)
             .in(list));
0
额外
@MiklosKrivan,两者都应该工作,这对我来说看起来更清楚。
额外 作者 jFrenetic,
@MiklosKrivan必须检查,谢谢澄清。
额外 作者 jFrenetic,
@MiklosKrivan请你在 pastebin 或别的地方分享你的堆栈跟踪,如果可能的话?
额外 作者 jFrenetic,
我不会说“不需要”,我会说“不要”。至少使用EclipseLink 2.6.2是肯定的。我测试过了。
额外 作者 Miklos Krivan,
我期望如此,但不幸的是使用EclipseLink 2.6.2 for ORM(我试过两种公式),isTrue()包装引发了所提到的异常。这就是我给出的措辞建议的原因。所以理论上“不需要”但实际上“不得”。
额外 作者 Miklos Krivan,