我有一个包含3列的MyTable示例 - id,common_id,creation_date,其中common_id将条目分组。
现在我想选择使用CriteriaBuilder来自每个组的所有最新条目(即每个common_id获取最新的creation_date)。
在SQL中,查询看起来像这样:
select * from MyTable where (common_id, creation_date) in (select common_id, max(creation_date) from MyTable group by common_id)
现在我尝试通过编写类似(cb是CriteriaBuilder,root是Root)来创建where谓词:
cb.array(root.get('common_id'), cb.max(root.get('creation_date')))
.in(
query.subquery(MyTable.class)
.select(cb.array(root.get('common_id'), cb.max(root.get('creation_date'))))
.groupBy(root.get('common_id')))
但不幸的是cb.array不是一个Expression(它是一个CompoundSelect),所以我不能在它上面使用.in()。
感谢指点!
答案 0 :(得分:2)
你能用JPQL创建吗?据我所知,这是不可能的。
我查看了Spect(4.6.16子查询),并谈到了#34; simples select expression":
simple_select_clause ::= SELECT [DISTINCT] simple_select_expression
我相信只有一次回归是可能的,如果你看那里的例子,你就找不到类似的东西。
您需要使用NativeQuery。