2011-11-23 102 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