JPA Criteria加入

时间:2011-08-02 06:11:54

标签: java-ee jpa entity criteria


我有两个实体类,有多对一的关系。我需要选择具有最小值小于提供的子记录的所有父记录。

@Entity
class Parent; {
String source;
}

@Entity
class child {
@ManyToOne Parent parent;
int value;
}

我需要选择Parent.source = X和min的所有Parent类(Child.value>< Y.如何在父/子实体上添加连接以及特定的选择标准?

CriteriaBuilder cb = context.em().getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(Parent.class);
Root r = cq.from(Parent.class);
Predicate p = cb.conjunction();
p = cb.and(p, cb.equal(r.get("source"), X));
Expression y = cb.literal(Y);
// what to do with y?
cq.where(p);
TypedQuery tq = context.em().createQuery(cq);
tq.setFirstResult(0);
tq.setMaxResults(100);
return tq.getResultList();

1 个答案:

答案 0 :(得分:3)

如果父母有一个孩子OneToMany,可能会更容易。但是对于你当前的模型,它应该是类似的,

CriteriaBuilder cb = context.em().getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(Parent.class);
Root r = cq.from(Parent.class);
Root child = cq.from(Child.class);
Predicate p = cb.and(cb.equal(r.get("source"), X), cb.equal(child.get("parent"), r));
Predicate p = cb.and(p, cb.lt(child.get("value"), Y)));
cq.where(p);
TypedQuery tq = context.em().createQuery(cq);
tq.setFirstResult(0);
tq.setMaxResults(100);
return tq.getResultList();

这将是任何孩子的值小于该值。对于所有人,您需要进行子查询。