[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.