亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 158 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號