【问题标题】:How to use JPA query to retrieve parent and last child entity如何使用 JPA 查询检索父实体和最后一个子实体
【发布时间】:2018-12-08 03:48:00
【问题描述】:

我有 2 个表,分别是 Parent 和 Child,它们是一对多的关系。

在实体类中,Parent 类有一个 Child 对象的列表。

如果使用 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)

【问题讨论】:

  • 先弄清楚如何在 SQL 中执行此操作并向我们展示您的努力
  • 如果这样行得通,为什么不尝试将其放入本机查询中呢? Query q = em.createNativeQuery (....);
  • 为什么要编写手动查询?为什么不标准构建器。你在用spring jpa吗?
  • 因为我的公司只是不允许开发人员编写原生 SQL。
  • CriteriaBuilder 如何提供帮助?

标签: java jpa eclipselink jpa-2.1


【解决方案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....[0-*],则需要左连接
【解决方案2】:

在一个 JPQL(或 CriteriaQuery)中解决这个问题会非常难看,检索 2 个对象实例,例如

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

你不能在选择中进行子查询

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

最简单的解决方案是:获取所有父母,然后寻找年长的孩子

【讨论】:

  • 我希望看到您的最终解决方案,因为您将我的回答定性为“无用”
猜你喜欢
  • 1970-01-01
  • 2020-12-04
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
相关资源
最近更新 更多