2015-12-30 64 views
3

我目前正在使用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中的工作...

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

回答

2

您不能在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) 

P.S.代码未经测试

+0

正是我所需要的!快速,干净和容易。 (我要求编辑,因为平等需要形状,颜色和名称;))谢谢! – Asoub