[英]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.