我在SQL中有这样一个查询,它没有显式地使用join
:select id as parentIds, (select COUNT(*) from ChildTable c where c.matching_id=p.id) as ChildTableRecords from ParentTable p where p.someId = 'some_value;
我尝试在JPA Criteria Builder中不使用JOINS来转换它,所以我尝试使用joins,但没有得到运行原始sql时得到的结果:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> cq = cb.createTupleQuery();
Root<ParentEntity> parent= cq.from(ParentEntity.class);
Join<ParentEntity, ChildEntity> childJoin = parent.join("matching_id",
JoinType.LEFT);
cq.select(cb.tuple(parent, cb.count(childJoin)));
cq.where(cb.equal(some where condition));
cq.groupBy(some group by columns);
List<Tuple> res = entityManager.createQuery(cq).getResultList();
1条答案
按热度按时间nfs0ujit1#
有两种可能的解决方案可以达到预期的结果,这两种方案都可以在Spring Data JPA或Quarkus以及所有JPA 2.0兼容框架中使用。
示例
在下面的例子中,我使用了两个父子关系的实体,我也使用了Quakus和Panache,但唯一的区别只是得到了一个
EntitiyManager
示例。因此,我有一个Tempalte实体(类似于父实体)和一个TemplateVersion(子实体),每个模板都可以有多个版本。
子查询
生成的SQL查询为
优点-缺点
@OneToMany
关系。示例代码包含该关系,因为其他解决方案需要。在这种情况下,完全不需要从模板获取版本。尺寸
优点-缺点
size
是一个标准功能。@OneToMany
关系。在某些情况下,这不是最佳方法。