如何解决聚合函数中的 CriteriaQuery DISTINCT 值
简介
考虑如下查询:
SELECT
building.name AS building_name,STRING_AGG(disTINCT visit.visitor_name,',') AS visitors,COUNT(visit.id) AS total_visits
FROM building
LEFT JOIN visit
ON building.id = visit.building_id
GROUP BY building.id
注意 disTINCT
聚合函数中使用的 STRING_AGG
关键字。结果可能如下所示:
+----------------------+-------------+--------------+
| building_name | visitors | total_visits |
+----------------------+-------------+--------------+
| Skyline Residence | Edgar,John | 6 |
| Forbidden Residence | | 0 |
| Cloud Nine Residence | John | 1 |
+----------------------+-------------+--------------+
重要的是,如果 John 和 Edgar 已经访问过 Skyline Residence 6 次,那么 visitors
列不应像 John,Edgar,John,John
那样多次显示他们的名字。
JPA 标准查询代码
到目前为止,这是我的 JPA CriteriaQuery
代码,没有 disTINCT
:
CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<ResultDto> query = builder.createquery(ResultDto.class);
Root<Building> building = query.from(Building.class);
Join<Building,Visit> visit = building.join("visits",JoinType.LEFT);
query.select(builder.construct(
ResultDto.class,building.get("name"),builder.function("STRING_AGG",String.class,visit.get("visitorName"),builder.literal(",")),builder.count(visit.get("id")) // ^ I need disTINCT here ^
));
query.groupBy(building.get("id"));
final TypedQuery<ResultDto> typedQuery = getEntityManager().createquery(query);
final List<ResultDto> resultList = typedQuery.getResultList();
如何修改此代码以生成上述 sql 查询,使用 disTINCT
?
注意:不要使用 Hibernate 已弃用的 Criteria
API 解决方案。应该使用 JPA 的 CriteriaQuery
来完成。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。