Post

[Querydsl] ์„œ๋ธŒ์ฟผ๋ฆฌ(SubQuery)

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” QueryDSL์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•œ๋‹ค.

์„œ๋ธŒ์ฟผ๋ฆฌ๋ž€? ํ•˜๋‚˜์˜ SQL ๋ฌธ ์•ˆ์—์„œ ๋˜ ๋‹ค๋ฅธ SQL ๋ฌธ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ. ๋ณต์žกํ•œ ์กฐ๊ฑด์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ๋•Œ ์“ด๋‹ค.

๐Ÿ’ก ์„œ๋ธŒ์ฟผ๋ฆฌ์—๋Š” ๋ณ„์นญ์ด ๋‹ค๋ฅธ Q-Type์ด ํ•„์š”ํ•˜๋‹ค. (QMember subMember = new QMember("subMember"))


1. ๋‹จ์ผ ๊ฒฐ๊ณผ ์„œ๋ธŒ์ฟผ๋ฆฌ

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜์ผ ๋•Œ (์˜ˆ: ์ตœ๋Œ€ ๋‚˜์ด์ธ ํšŒ์›).

1
2
3
4
5
6
7
8
QMember subMember = new QMember("subMember");

List<Member> members = queryFactory
    .selectFrom(member)
    .where(member.age.eq(                                    // ๋‚˜์ด๊ฐ€ = ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ
        JPAExpressions.select(subMember.age.max()).from(subMember)
    ))
    .fetch();

2. ๋‹ค์ค‘ ๊ฒฐ๊ณผ ์„œ๋ธŒ์ฟผ๋ฆฌ

์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ (์˜ˆ: ํ‰๊ท  ์ด์ƒ ์ฃผ๋ฌธ).

1
2
3
4
5
6
7
8
QOrder subOrder = new QOrder("subOrder");

List<Order> orders = queryFactory
    .selectFrom(order)
    .where(order.orderAmount.gt(                             // > ํ‰๊ท 
        JPAExpressions.select(subOrder.orderAmount.avg()).from(subOrder)
    ))
    .fetch();

3. exists ์„œ๋ธŒ์ฟผ๋ฆฌ

์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ๋•Œ.

1
2
3
4
5
6
7
8
QMember subMember = new QMember("subMember");

List<Member> members = queryFactory
    .selectFrom(member)
    .where(JPAExpressions.selectFrom(subMember)
        .where(subMember.team.eq(member.team))
        .exists())   // ๊ฐ™์€ ํŒ€ ํšŒ์›์ด ์กด์žฌํ•˜๋ฉด
    .fetch();
์œ ํ˜•์šฉ๋„
๋‹จ์ผ ๊ฒฐ๊ณผeq()๋กœ ๊ฐ’ ๋น„๊ต (max ๋“ฑ)
๋‹ค์ค‘ ๊ฒฐ๊ณผgt(), in() ๋“ฑ
exists์กด์žฌ ์—ฌ๋ถ€ (exists/notExists)

๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
5
QueryDSL ์„œ๋ธŒ์ฟผ๋ฆฌ
โ”œโ”€ ์ค€๋น„   ๋ณ„์นญ ๋‹ค๋ฅธ Q-Type (new QMember("sub"))
โ”œโ”€ ๋‹จ์ผ   where(...eq(select max...))
โ”œโ”€ ๋‹ค์ค‘   where(...gt(select avg...))
โ””โ”€ exists ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
์„œ๋ธŒ์ฟผ๋ฆฌ์ฟผ๋ฆฌ ์•ˆ์˜ ์ฟผ๋ฆฌ
JPAExpressions์„œ๋ธŒ์ฟผ๋ฆฌ ์ž‘์„ฑ ๋„๊ตฌ
exists์กด์žฌ ์—ฌ๋ถ€ ๊ฒ€์‚ฌ

์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๋ณต์žกํ•œ ์กฐ๊ฑด์„ ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ๋กœ ํ‘œํ˜„ํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. ๋ณ„์นญ์ด ๋‹ค๋ฅธ Q-Type์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ , ๊ฒฐ๊ณผ๊ฐ€ ๋งŽ์œผ๋ฉด ์„ฑ๋Šฅ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์ž.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.