【问题标题】:How to select multiple columns in subquery using JPA Criteria如何使用 JPA Criteria 在子查询中选择多个列
【发布时间】: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


【解决方案1】:

JPA 不允许在子查询中选择多个表达式,事实上,在子查询中选择用exists 包装的任何内容都是没有意义的。只需选择一个常数值,例如整数1

【讨论】:

    【解决方案2】:

    exists 中使用的子选择中选择两列没有任何意义。而且我不确定它是否合法。

    只需使用其中一列或文字。

    【讨论】:

    • 我需要按名字和姓氏进行 GROUP BY。这就是为什么我将它们都包括在选择中的原因。您能否提供更多有关文字的信息。
    猜你喜欢
    • 2018-01-23
    • 2014-09-04
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 2014-06-29
    • 2015-02-15
    • 1970-01-01
    相关资源
    最近更新 更多