2011-08-02 90 views
1


我有兩個具有多對一關係的實體類。我需要選擇所有具有最小值小於所提供的子記錄的父記錄。
JPA標準加入

@Entity
class Parent; {
String source;
}

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

我需要做的是選擇所有的父類,其中Parent.source = X和分鐘(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();

回答

2

可能會更容易。但隨着當前模型應該是這樣的,

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(); 

這將是任何孩子的價值低於價值。對於所有的,你需要做一個子查詢。

+0

太棒了!所以「加入」是由孩子 - >父母AND完成的。非常感謝! – Gadi