在 JPA 的 SQL 查询中的 FROM 语句中包含子查询

Posted

技术标签:

【中文标题】在 JPA 的 SQL 查询中的 FROM 语句中包含子查询【英文标题】:Including a subquery within the FROM statement in a SQL query in JPA 【发布时间】:2019-10-01 19:45:40 【问题描述】:

我有一个 Spring Boot 应用程序。在其中,我有一个 SQL 查询,它需要创建一个子查询,将该子查询的结果与另一个表进行内部连接,然后从该内部连接的结果中进行选择。但显然 JPA 不允许您在 FROM 子句中使用子查询(我假设既不使用 JPQL 也不使用 Criteria API)。有没有办法解决?

我曾考虑将子查询的结果存储在临时实体中(最好不要创建可持久保存到数据库的表),然后从存储在这些实体中的数据中进行选择。但我不确定如何使用 Spring 来做到这一点。我想要比创建缓存更“临时”的东西,因为在执行查询后子查询的结果会从内存中消失。

这是一个类似于我想要做的 SQL 查询:

SELECT g1.name, g1.publisher, g1.price, g1.released_at
FROM games AS g1
INNER JOIN (
  SELECT released_at, MAX(price) as price
  FROM games
  GROUP BY released_at
) AS g2
ON g2.released_at = g1.released_at AND g2.price = g1.price;

我期待此处描述的 SQL 查询的结果: http://bernardoamc.github.io/sql/2015/05/04/group-by-non-aggregate-columns/

【问题讨论】:

您想使用此查询解决的真正问题是什么?你能再描述一点吗?我猜你想找到每个发布日期都有最高价格的游戏。它是否正确?如果是,请查看我的解决方案。 【参考方案1】:

我认为你需要这个查询:

Select g from games g where not exists (
   Select g1 from games g1 
    where g1.released_at = g.released_at and g1.price >= g.price
)

【讨论】:

以上是关于在 JPA 的 SQL 查询中的 FROM 语句中包含子查询的主要内容,如果未能解决你的问题,请参考以下文章

from 子句中的 JPA/hibernate 子查询

SpringData专题-JPA中的复杂查询

MySQL的子查询中FROM和EXISTS子句的使用教程

SQL语句中的t.是啥意思,例如 select *from cityinfo t where t

求sql语句:选出一个查询结果中id最小的一行

sql 中的查询语句