Как использовать запрос JPA для извлечения родительской и последней дочерней сущности - PullRequest
0 голосов
/ 29 июня 2018

У меня есть 2 таблицы, в которых говорится «Родитель и ребенок», и это отношения «один ко многим».

В классах сущностей у родительского класса есть список дочерних объектов.

Так что, если использовать запрос JPA, как я могу написать запрос для получения всех родителей и их последнего потомка?

Может случиться так, что у Родителя нет ребенка.

При использовании sql это будет выглядеть так:

select * from parent p 
  left outer join child c on c.parent_id = p.id 
where c.child_id is null 
   or c.child_id = ( 
select child_id from ( 
select child_id  
  from child d 
 where d.parent_id = p.id order by child_age DESC, child_id DESC) 
where rownum<=1)

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

решить это в одном JPQL (или CriteriaQuery) было бы очень уродливо, получив 2 экземпляра объекта, таких как

SELECT p, lastChild FROM Parent p LEFT JOIN p.children c

вы не можете ни подзапрос в select

SELECT p, (SELECT c FROM Child c where c.parent = p ORDER BY c.age DESC) FROM Parent p

самое простое решение было бы: получить всех родителей, а затем найти старшего ребенка

0 голосов
/ 29 июня 2018

Вы можете использовать CriteriaBuilder для получения из EntityManager, а затем получить CriteriaQuery из него. Я принимаю Родительскую сущность здесь как Учителя, а Дочернюю сущность - как Телефон. Ниже приведен код для получения всех номеров телефонов по имени учителя first_ame.

  CriteriaBuilder cb = em.getCriteriaBuilder();
  CriteriaQuery<Phone> query = cb.createQuery(Phone.class);
  Root<Teacher> teacher = query.from(Teacher.class);
  Join<Teacher, Phone> phones = teacher.join("phones",JoinType.LEFT);
  query.select(phones).where(cb.equal(teacher.get("firstName"), "prasad"));

List<Phone> results = em.createQuery(query).getResultList();
for (Phone phone : results) {
    System.out.println("Number = " + phone.getNumber() + " "
        + "Type = " + phone.getType());
}
...