我目前正在使用JPQL(最新版本,我认为)与postgresql数据库,我试图得到由一些(不是所有列)分组最新的对象。JPQL/SQL获取最新的记录按列分组
比方说,我有一个表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进行分组。我尝试使用嵌套选择,但我现在有同样的问题与编号..
我发现了最大的每组问题(SQL Select only rows with Max Value on a Column)SO的标题建议orginaly键入问题后,所以我创建命名查询是这样的:
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
这点让java.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中的工作...
任何提示,欢迎提前致谢。
正是我所需要的!快速,干净和容易。 (我要求编辑,因为平等需要形状,颜色和名称;))谢谢! – Asoub