为了账号安全,请及时绑定邮箱和手机立即绑定

在 querydsl 中选择每组最大的元素

在 querydsl 中选择每组最大的元素

手掌心 2023-10-13 15:10:51
我有一个 sql 表,大致如下所示:+-----+------+-------+|  id | type | value |+-----+------+-------+|  1  |   X  |   20  ||  2  |   X  |   30  ||  3  |   Y  |  200  ||  4  |   Y  |  500  ||  5  |   Y  |  300  ||  6  |   Z  |    5  |+-----+------+-------+对于每种类型,我想检索具有最大值的行。这是我的预期结果:+-----+------+|  id | type |+-----+------+|  2  |   X  | <-- had value = 30|  4  |   Y  | <-- had value = 500|  6  |   Z  | <-- had value = 5+-----+------+在 SQL 中,这可以表达如下(假设对于每种类型,不存在具有相同值的两个条目,我可以排除这一点):select t1.id, t1.type from T t1inner join (  select t2.type, max(t2.value) as max_value from T t2  group by t2.type) on t1.type = t2.type  and t1.value = max_value但是我找不到使用 QueryDSL(版本 4)表达相同内容的方法。我试过这个:final JPQLQuery<Tuple> subquery = JPAExpressions    .from(q2)    .select(q2.type, q2.value.max())    .groupBy(q2.type);final JPQLQuery<Tuple> query = JPAExpressions    .from(q1)    .select(q1.id, q1.type)    .from(q1)    .innerJoin(subquery) // <-- not allowed    .on(q1.type.eq(q2.type), q1.value.eq(q2.value.max()));但是innerJoin()(和其他连接方法)仅采用表达式作为参数,而不是另一个查询。也同样如此from()。
查看完整描述

2 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

where子查询可以以表达式的形式放入外部查询的子句中exists:


final JPQLQuery<Tuple> subquery = JPAExpressions

    .from(q2)

    .select(q2.type, q2.value.max())

    .groupBy(q2.type);

final JPQLQuery<Tuple> query = JPAExpressions

    .from(q1)

    .select(q1.id, q1.type)

    .from(q1)

    .where(subquery

        .having(q1.type.eq(q2.type), q1.value.eq(q2.value.max()))

        .exists());

请注意,此查询可能效率很低。


查看完整回答
反对 回复 2023-10-13
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

为了获取前 1 个元素,您可以使用:

JPAExpressions.selectFrom(table)
    .select(table.dateTimeColumn.max())


查看完整回答
反对 回复 2023-10-13
  • 2 回答
  • 0 关注
  • 70 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信