java - JPQL/SQL 获取最新的按列分组的记录

标签 java postgresql jpa jpql greatest-n-per-group

我目前正在将 JPQL(我认为是最新版本)与 postgresql 数据库一起使用,并且我正在尝试获取按某些(不是所有列)分组的最新对象。

假设我有一个这样的表 MyTable:

id | name | color | shape | date_of_creation | other_stuff|
---+------+-------+-------+------------------+------------+
01 | apple|    red| circle|        30/12/2015|       stuff|
02 | apple|    red| circle|        15/12/2015|   somestuff|
03 | apple|  green| circle|        01/12/2015|anotherstuff|
04 |   box| orange|  cubic|        13/12/2015|   blahblah1|
05 |   box| orange|  cubic|        25/12/2015|   blahblah2|

我只想要像这样按名称、颜色和形状分组的最新消息:

id | name | color | shape | date_of_creation | other_stuff|
---+------+-------+-------+------------------+------------+
01 | apple|    red| circle|        30/12/2015|       stuff|
05 |   box| orange|  cubic|        25/12/2015|   blahblah2|

让我们假设 java 等效项是具有相同元素的 MyClass。

我在 JPQL 中的查询看起来像这样:

SELECT m FROM MyClass m GROUP BY m.name, m.color, m.shape ORDER BY m.date_of_creation;

但这不起作用,因为“date_of_creation”必须在“GROUP BY”子句中,这没有意义,因为我不想按 date_of_creation 分组。我尝试使用嵌套选择,但我现在遇到了与 id 相同的问题..

在最初输入问题后,我在 SO 的标题建议中发现了每组最大 n 个问题 ( SQL Select only rows with Max Value on a Column ),因此我创建了一个这样的命名查询:

SELECT m FROM Myclass LEFT JOIN m.id mleft WHERE 
    m.name = mleft.name AND 
    m.color = mleft.color AND
    m.shape = mleft.shape AND
    m.date_of_creation < mleft.date_of_creation AND
    mleft.id = null

在 org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:395) 处产生 java.lang.NullPointerException 或什至不工作(没有错误,没有) .我想是因为“id”这个字段本身没有关系。并且在 JPQL 中使用内部连接和内部选择似乎不起作用:

SELECT m FROM MyClass INNER JOIN (SELECT mInner from Myclass GROUP BY m.name etc.)

也许我遗漏了什么,我将不得不构建一个更复杂的查询,但 JPQL 似乎不够强大,或者我对它的了解还不够。 另外,我真的不想使用 query.getResultList() 并在 java 中完成工作...

欢迎任何提示,提前致谢。

最佳答案

您不能在 JPQL 的 FROM block 中使用子查询,只允许使用 SELECT 和 WHERE block 。尝试这样的事情:

SELECT m 
FROM Myclass m
WHERE m.date_of_creation IN ( SELECT MAX(mm.date_of_creation)
    FROM Myclass mm
    WHERE mm.id = m.id)

附言代码未经测试

关于java - JPQL/SQL 获取最新的按列分组的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34526755/

相关文章:

java - 如何显示html/rich格式的邮件?

sql - 如何查询空对象的 json 列?

postgresql - Postgres - 即使我的角色/用户已被授予 'SELECT',也不能从表中获取 'READ'

mysql - MySQL 仍然是免费/开源数据库的不错选择吗?

java - 如何删除实体列表

java - Maven 默认分隔符

java - 如何将模拟注入(inject)到需要构造函数参数的 bean 中

java - 单击使用 sikuli 多次使用的特定下拉项

java - 如何在 Spring JPA 中为审计字段 @CreatedDate、@LastModifiedDate 保存 UTC 格式的时间戳

java - @Query 和存储库中的错误