我知道这对你们一些人来说可能是一个非常简单的问题,但是我很难找到如何建立一个简单的选择*来自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的东西,所以希望你能得到一些答案。
感谢。
答案 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章。
此致 托马斯