我正在尝试使用QueryDSL编写一个查询,以按其parentId分组获取表中最古老的元素。
对应的SQL语句应该是:
SELECT a.* FROM child a
INNER JOIN
(
SELECT parentId, MAX(revision) FROM child GROUP BY parentId
) b
ON (
a.parentId = b.parentId AND a.revision = b.revision
)
现在在QueryDSL中,我被语法卡住了。
JPQLQuery<Tuple> subquery = JPAExpressions
.select(child.parent, child.revision.max())
.from(child)
.groupBy(child.parent);
HibernateQuery<Child> query = new HibernateQuery<>(session);
query.from(child)
.where(child.parent.eq(subquery.???).and(child.revision.eq(subquery.???))));
如何使用子查询编写此查询?
表看起来像这样:
___parent___(在此查询中未使用,但存在) parentId P1 | * P2 | * P3 | *
___child___ parentId | revision P1 | 1 | * P1 | 2 | * P1 | 3 | * P2 | 2 | * P2 | 3 | * P3 | 1 | *
___child 的结果,每个 parentId 的最高修订版___ P1 | 3 | * P2 | 3 | * P3 | 1 | *
我尝试过的:
.where(JPAExpressions.select(child.parent,child.revision).eq(subquery));
-> org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected end of subtree
还有许多语法错误...
目前我使用了一个不太好的循环,因为我还没有找到解决办法。