JPA Criteria Query - 是否可以添加具有多个字段的内部联接子查询

问题描述 投票:0回答:1

我有下面的查询,想将其转换为条件查询。但是,我在网上看到的大多数示例仅使用子查询中的单个选定字段。是否可以有多个选定的子查询字段?

select * from quiz q (
  inner join select max_date(createdBy), completeName
  from quiz
  group by completeName
) latest_quiz on latest_quiz = q.createdBy and latest_quiz.completeName
java jpa criteria
1个回答
0
投票

是的,可以将子查询中具有多个选定字段的查询转换为 Java 中的 Criteria API 查询。在您的情况下,您希望有一个返回多列(

max_date(createdBy)
completeName
)的子查询,并在连接条件中使用它。

虽然 Criteria API 不像 SQL 那样直接支持多字段子查询,但您仍然可以通过使用

Expression
对象并连接这些值来实现相同的逻辑。

以下是如何使用 Criteria API 构造此查询:

假设:

  • 主实体
    Quiz
    有一个
    createdBy
    completeName
    字段。
  • 您正在尝试连接计算的子查询的结果
    max(createdBy)
    对于每个
    completeName

您可以采用以下方法:

  1. Quiz
    (外部查询)创建主查询。
  2. 定义一个选择
    max(createdBy)
    completeName
    的子查询 对于每个
    completeName
  3. join
    where
    子句中使用子查询进行比较。

示例代码:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Quiz> cq = cb.createQuery(Quiz.class);
Root<Quiz> quizRoot = cq.from(Quiz.class);

// Create the subquery
Subquery<Object[]> subquery = cq.subquery(Object[].class);
Root<Quiz> subqueryRoot = subquery.from(Quiz.class);

// Select the max createdBy and completeName
Expression<Date> maxCreatedBy = cb.max(subqueryRoot.get("createdBy"));
Expression<String> completeName = subqueryRoot.get("completeName");

// Group by completeName
subquery.select(cb.array(maxCreatedBy, completeName))
        .groupBy(completeName);

// Join the subquery result
Join<Quiz, Object[]> subqueryJoin = quizRoot.join(subquery, JoinType.INNER);

// Use the subquery values in the join condition
cq.where(cb.equal(quizRoot.get("createdBy"), subquery.getSelection().get(0)), 
         cb.equal(quizRoot.get("completeName"), subquery.getSelection().get(1)));

// Execute the query
List<Quiz> results = entityManager.createQuery(cq).getResultList();

说明:

  1. 子查询:子查询使用
    max(createdBy)
    选择
    completeName
    cb.array()
    。这允许您按
    completeName
    进行分组并获取每个
    createdBy
    的最大
    completeName
  2. Join: 外部查询(
    Quiz
    实体)与查询的结果相连接 子查询。连接的条件基于
    createdBy
    completeName
    与子查询中的值匹配的字段。
  3. Where 子句:
    where
    子句确保了之间的比较 主实体和子查询的选定字段(
    createdBy
    completeName
    )。
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.