【发布时间】:2021-08-30 21:37:15
【问题描述】:
我正在尝试使用 JPA 条件编写以下查询,但我无法在子查询中选择多个列。
SELECT a.id, a.firstName, a.lastName
FROM PORTRAIT a
JOIN (SELECT firstName, lastName
FROM PORTRAIT
GROUP BY firstName, lastName
HAVING count(id) > 1 ) b
ON b.firstName = a.firstName
AND b.lastName = a.lastName
ORDER BY a.lastName asc
or
SELECT a.id, a.FIRSTNAME, a.LASTNAME
FROM PORTRAIT a where exists (
SELECT b.firstName, b.lastName
FROM PORTRAIT b
WHERE b.firstName = a.firstName
AND b.lastName = a.lastName
GROUP BY b.firstName, b.lastName
HAVING count(b.id) > 1
)
我在下面的实现中间卡住了,我无法找出如何在子查询中选择多个列。请在代码中查看我的评论(在第 3 行)。
Subquery<PortraitVO> portraitSubQuery = criteriaQuery.subquery(PortraitVO.class);
Root<PortraitVO> portraitRoot = portraitSubQuery.from(PortraitVO.class);
portraitSubQuery.select(portraitRoot); // Here I want to select multiple columns
portraitSubQuery.where(criteriaBuilder.and(criteriaBuilder.equal(portraitRoot.get(RestServiceConstants.FIRST_NAME), root.get(RestServiceConstants.FIRST_NAME)), criteriaBuilder.equal(portraitRoot.get(RestServiceConstants.LAST_NAME), root.get(RestServiceConstants.LAST_NAME))));
List<String> columnNames = new ArrayList<String>();
columnNames.add(RestServiceConstants.FIRST_NAME);
columnNames.add(RestServiceConstants.LAST_NAME);
List<Expression<?>> columnNamesExpression = columnNames.stream().map(x -> portraitRoot.get(x))
.collect(Collectors.toList());
portraitSubQuery.groupBy(columnNamesExpression);
portraitSubQuery.having(criteriaBuilder.gt(criteriaBuilder.count(portraitRoot), 1));
请帮我解决这个问题。
【问题讨论】:
-
为什么要在exists子句的子选择中选择多个列?
-
@JensSchauder 我需要按名字和姓氏进行 GROUP BY。这就是我将它们都包含在选择中的原因。
标签: java hibernate jpa spring-data-jpa criteria