![](/img/trans.png)
[英]In JPA: counting results of query with where clause using CriteriaQuery
[英]JPA - CriteriaQuery with “WHERE” clause
我知道这对你们来说可能是一个非常简单的问题,但是我很难找到如何使用CriteriaBuilder构建一个简单的Select * From X Where Xa =:myparam 。
现在,这是我到目前为止构建的代码:
CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery();
Root<MyClass1> r = cq.from(MyClass1.class);
cq.select(r);
ParameterExpression<Long> p = cb.parameter(Long.class);
cq.where(cb.equal(r.get("anotherClass.id"), p));
javax.persistence.Query q = getEntityManager().createQuery(cq);
我应用此查询的类是这样的:
@Entity
public class MyClass1 implements Serializable {
@Id
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ANOTHERCLASS_ID")
private AnotherClass anotherClass;
...
}
@Entity
public class AnotherClass implements Serializable {
@Id
private Long id;
...
}
我只需要从myclass1 “WHERE” anotherClass.id = 1L中选择所有记录,我在哪里设置“1L”,我知道它在p中但是在哪里?
就这样。 看起来很简单,但我真的不熟悉这个CriteriaBuilder的东西,所以希望你能得到一些答案。
谢谢。
Criteria查询中的参数与JPQL或本机查询中的相同,您可以在Query上设置它们。
即
javax.persistence.Query q = getEntityManager().createQuery(cq);
q.setParameter(1, 1L);
请注意,您正在使用位置参数,使用命名的参数将名称传递给parameter()。
ParameterExpression<Long> p = cb.parameter(Long.class, "id");
...
q.setParameter("id", 1L);
参见http://en.wikibooks.org/wiki/Java_Persistence/Querying#Parameters
您正尝试在where子句表达式中使用连接表,因此您需要首先在tghe表之间使用连接。
... Join<MyClass1,ANotherClass> pathA = r.join(MyClass.anotherClass); ... cb.where(cb.equal(pathA.get(AnotherClass_.id), p));
如果您已经构建了Metamodel类。 另请参阅Java EE教程的第40章。
此致,托马斯
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.