问题描述
简介
考虑如下查询:
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 (将#修改为@)