我有一個(gè) sql 表,大致如下所示:+-----+------+-------+| id | type | value |+-----+------+-------+| 1 | X | 20 || 2 | X | 30 || 3 | Y | 200 || 4 | Y | 500 || 5 | Y | 300 || 6 | Z | 5 |+-----+------+-------+對(duì)于每種類型,我想檢索具有最大值的行。這是我的預(yù)期結(jié)果:+-----+------+| id | type |+-----+------+| 2 | X | <-- had value = 30| 4 | Y | <-- had value = 500| 6 | Z | <-- had value = 5+-----+------+在 SQL 中,這可以表達(dá)如下(假設(shè)對(duì)于每種類型,不存在具有相同值的兩個(gè)條目,我可以排除這一點(diǎn)):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)表達(dá)相同內(nèi)容的方法。我試過這個(gè):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()(和其他連接方法)僅采用表達(dá)式作為參數(shù),而不是另一個(gè)查詢。也同樣如此from()。
2 回答

慕桂英3389331
TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
where子查詢可以以表達(dá)式的形式放入外部查詢的子句中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());
請(qǐng)注意,此查詢可能效率很低。

慕蓋茨4494581
TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊
為了獲取前 1 個(gè)元素,您可以使用:
JPAExpressions.selectFrom(table) .select(table.dateTimeColumn.max())
添加回答
舉報(bào)
0/150
提交
取消