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

阿苏布

我目前正在将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 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

这使ajava.lang.NullPointerException at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:395)或什至不起作用(没有错误,什么也没有)。我认为这是因为字段“ id”与其自身没有关系。在JPQL中似乎无法使用内部连接和内部选择连接:

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

也许我缺少了一些东西,我将不得不构建一个更复杂的查询,但是JPQL似乎不够强大,或者我对此不够了解。另外,我真的不喜欢使用query.getResultList()并在Java中进行工作...

欢迎任何提示,谢谢。

爪哇病

您不能在JPQL的FROM块中使用子查询,仅允许SELECT和WHERE块。尝试这样的方法:

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)

PS代码未经测试

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章