JPA - 带有“WHERE”子句的CriteriaQuery

时间:2011-11-23 23:10:33

标签: java jpa criteria

我知道这对你们一些人来说可能是一个非常简单的问题,但是我很难找到如何建立一个简单的选择*来自X其中Xa =:myparam 使用 CriteriaBuilder

现在,这是我到目前为止构建的代码:

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

感谢。

2 个答案:

答案 0 :(得分:3)

参数在Criteria查询中设置与JPQL或本机查询相同,您可以在查询中设置它们。

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

答案 1 :(得分:1)

您正在尝试在where子句表达式中使用连接表,因此您需要首先在tghe表之间使用连接。

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

...

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

如果您已构建Metamodel类。另请参阅Java EE教程的第40章。

此致 托马斯