微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

聚合函数中的 CriteriaQuery DISTINCT 值

如何解决聚合函数中的 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 举报,一经查实,本站将立刻删除。