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

我有一个 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 t1

inner 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()。


手掌心
浏览 112回答 2
2回答

慕桂英3389331

where子查询可以以表达式的形式放入外部查询的子句中exists:final JPQLQuery<Tuple> subquery = JPAExpressions&nbsp; &nbsp; .from(q2)&nbsp; &nbsp; .select(q2.type, q2.value.max())&nbsp; &nbsp; .groupBy(q2.type);final JPQLQuery<Tuple> query = JPAExpressions&nbsp; &nbsp; .from(q1)&nbsp; &nbsp; .select(q1.id, q1.type)&nbsp; &nbsp; .from(q1)&nbsp; &nbsp; .where(subquery&nbsp; &nbsp; &nbsp; &nbsp; .having(q1.type.eq(q2.type), q1.value.eq(q2.value.max()))&nbsp; &nbsp; &nbsp; &nbsp; .exists());请注意,此查询可能效率很低。

慕盖茨4494581

为了获取前 1 个元素,您可以使用:JPAExpressions.selectFrom(table) &nbsp;&nbsp;&nbsp;&nbsp;.select(table.dateTimeColumn.max())
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java