当前位置: 首页 > 知识库问答 >
问题:

如何使用JPA条件在子查询中选择多列

黄弘盛
2023-03-14

我试图使用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
)

我陷入了下面的实现过程中,无法找到如何在子查询中选择多个列。请看我在代码中的评论(第三行)。

    
        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));

请帮我解决这个问题。

共有2个答案

隗新霁
2023-03-14

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

景宏富
2023-03-14

在存在中使用的子选择中选择两列没有任何意义。我不确定这是否合法。

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

 类似资料:
  • JPA Criteria似乎坚持认为min()(和max())只适用于数字字段。然而,情况并非如此,因为SQL数据库确实可以从字符串列中选择min()和max()值。我还可以使用JQL选择字符串列的min()或max()值。 但是,当使用条件查询时,编译器会在 min() 与字符串列一起使用时进行报错:绑定不匹配:条件生成器类型的泛型方法 min(表达式)不适用于参数(子查询.get(“strin

  • 我试图使用CritierBuilder/CrtieriaQuery执行select语句,从表a中选择某些字段,然后如果该记录存在于另一个表中,则使用布尔标志。 基本上,我有一个“官员”列表和一个用户列表。用户是使用该系统的人,可以为官员添加书签/保存信息。当用户询问官员时,我希望能够显示他们已经为哪些官员添加了书签。 所以这个查询,我在我的h2数据库控制台中运行,它(相当)有效。如果官员被用户12

  • 但是我在遗留系统上有一个具有许多属性的对象,我只想选择几个,尽管我知道选择几个属性通常是很快的。 如果不使用条件查询,这可能吗?

  • 现在我需要正在学习‘程序设计’课程的学生名单 如何使用条件查询实现这一点。

  • 我已尝试获取以下代码的结果: 在某些情况下,我需要在上面使用“In cause”。我尝试使用获得结果,但对于param:ref它不能在本机查询中工作,但在ejb ql中,我只是得到了以下错误消息: null 我累坏了,大家能给我一些建议吗?thx寻求帮助

  • 我有一个关于jpa中的子查询类的问题。我需要创建两个自定义字段的子查询,但是子查询没有多选方法,选择方法有表达式输入参数(在查询中这是选择)和配置方法不合适。 此外,我对联接子查询结果有疑问,是否可能?怎么做呢? 我有: 链延伸度 消息实体 查询包装 我需要创建这个查询(这是查询的一部分,我从谓词中获得的另一部分。JPQL不合适) 在子查询中我做 但是,子查询在params中没有带有Compoun