我有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)
答案 0 :(得分:-1)
您可以使用CriteriaBuilder从EntityManager获取,然后从中获取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
最简单的解决方案是:得到所有父母,然后寻找大一点的孩子