JPA Критерии присоединения - PullRequest
       15

JPA Критерии присоединения

1 голос
/ 02 августа 2011


У меня есть два класса сущностей со многими отношениями к одному. Мне нужно выбрать все родительские записи, у которых есть дочерняя запись со значением min, меньшим, чем указано.

@Entity <br/> class Parent; { <br/> String source; <br/> } <br/></p> <p>@Entity <br/> class child { <br/> @ManyToOne Parent parent; <br/> int value; <br/> }

Что мне нужно, это выбрать все родительские классы, где Parent.source = X и min (Child.value>

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

1 Ответ

3 голосов
/ 02 августа 2011

Может быть проще, если у родителя есть ребенок 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();

Это значит, что любой дочерний элемент имеет значение меньше значения.Для всех вам потребуется выполнить подзапрос.

...