如何使用JPA查询来检索父实体和最后一个子实体

时间:2018-06-29 02:19:24

标签: java jpa eclipselink jpa-2.1

我有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 :(得分:-1)

您可以使用CriteriaBuilder从Ent​​ityManager获取,然后从中获取CriteriaQuery。 我假设此处的父实体是教师,孩子的实体是电话。下面的代码是按名师姓名提取所有电话号码。

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

答案 1 :(得分:-1)

在一个JPQL(或CriteriaQuery)中解决此问题非常难看,检索了

之类的2个对象实例

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

u不能在select子查询中

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

最简单的解决方案是:得到所有父母,然后寻找大一点的孩子