2011-11-23 121 views
4

我知道這可能是一個非常簡單的問題,但我很難找到如何建立一個簡單的選擇*從X其中Xa = :myparam使用CriteriaBuilder。現在JPA - CriteriaQuery與「WHERE」子句

,這是我設法到目前爲止構建代碼:

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的東西,所以希望你能有一些答案。

謝謝。

回答

3

參數在條件查詢中設置與JPQL或原生查詢中相同,您可以在查詢中設置它們。

javax.persistence.Query q = getEntityManager().createQuery(cq); 
q.setParameter(1, 1L); 

請注意,您使用的是位置參數,使用一個名爲傳遞名稱參數()。

ParameterExpression<Long> p = cb.parameter(Long.class, "id"); 
... 
q.setParameter("id", 1L); 

見, http://en.wikibooks.org/wiki/Java_Persistence/Querying#Parameters

1

你想在where子句表達式中使用一個連接表,所以你需要先用tghe表之間的聯接。

 
... 
Join<MyClass1,ANotherClass> pathA = r.join(MyClass.anotherClass); 

... 

cb.where(cb.equal(pathA.get(AnotherClass_.id), p)); 

假設您已經構建了元模型類。另請參閱Java EE教程的第40章。

Regards, Thomas