JPQL/SQL 获取按列分组的最新记录
JPQL/SQL get the latest of records grouped by columns
我目前正在将 JPQL(我认为是最新版本)与 postgresql 数据库一起使用,我正在尝试获取按某些(不是所有列)分组的最新 objects。
假设我有一个这样的 table 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 分组。我尝试使用嵌套 select 但我现在遇到了与 id 相同的问题..
我在最初输入问题后发现了关于 SO 标题建议的 greatest-n-per-group 问题 ( 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
这使得 java.lang.NullPointerException at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:395)
或什至不起作用(没有错误,没有)。我想是因为"id"这个字段跟自己没有关系。并且在 JPQL 中使用带有 select 的内部连接似乎不起作用:
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)
P.S。代码未测试
我目前正在将 JPQL(我认为是最新版本)与 postgresql 数据库一起使用,我正在尝试获取按某些(不是所有列)分组的最新 objects。
假设我有一个这样的 table 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 分组。我尝试使用嵌套 select 但我现在遇到了与 id 相同的问题..
我在最初输入问题后发现了关于 SO 标题建议的 greatest-n-per-group 问题 ( 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
这使得 java.lang.NullPointerException at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:395)
或什至不起作用(没有错误,没有)。我想是因为"id"这个字段跟自己没有关系。并且在 JPQL 中使用带有 select 的内部连接似乎不起作用:
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)
P.S。代码未测试