簡體   English   中英

JPA - 帶有“WHERE”子句的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM