2011-08-02 7 views
1


많은 관계가있는 두 개의 엔티티 클래스가 있습니다. 제공된 최소값보다 작은 하위 레코드가있는 모든 상위 레코드를 선택해야합니다. 내가 필요로 무엇
JPA 조건부 합류

@Entity
class Parent; {
String source;
}

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

는 Parent.source = X 및 분 (Child.value> < Y.가 어떻게 부모/자식 엔티티 및 특정 조인 추가 할 수있는 모든 상위 클래스를 선택하는 것입니다 부모가 다시 아이를 OneToMany 경우 선택 기준?

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

위대한! 그래서 "join"은 child -> parent AND에 의해 수행됩니다. 고마워요! – Gadi