[Querydsl] ์ง๊ณํจ์(Aggregate Function)
๐ ๋ค์ด๊ฐ๋ฉฐ
์ด๋ฒ ๊ธ์์๋ QueryDSL์ ์ง๊ณ ํจ์๋ฅผ ์ ๋ฆฌํ๋ค.
์ง๊ณ ํจ์๋? ์ฌ๋ฌ ํ์ ๋ฐ์ดํฐ๋ฅผ ํ๋๋ก ํฉ์น๊ฑฐ๋, ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ณ์ฐํ๋ ํจ์. ๋ฐ์ดํฐ ๋ถ์ยทํต๊ณ์ ํ์๋ค.
1. count
1
2
3
4
long productCount = queryFactory
.selectFrom(product)
.where(product.price.gt(1000))
.fetchCount(); // ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์
2. sum ยท avg ยท min ยท max
์ซ์ํ ๋ฐ์ดํฐ์ ํฉ๊ณยทํ๊ท ยท์ต์ยท์ต๋๋ฅผ ๊ณ์ฐํ๋ค.
1
2
3
4
BigDecimal totalAmount = queryFactory
.select(product.amount.sum()) // ํฉ๊ณ
.from(product)
.fetchOne();
| ํจ์ | ์ญํ |
|---|---|
.sum() | ํฉ๊ณ |
.avg() | ํ๊ท |
.min() / .max() | ์ต์ / ์ต๋ |
.count() / fetchCount() | ๊ฐ์ |
3. groupBy์ ํจ๊ป
ํน์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํ ๋ค ์ง๊ณํ๋ค. ์ฌ๋ฌ ์ปฌ๋ผ์ ์ ํํ๋ฉด Tuple๋ก ๋ฐ๋๋ค.
1
2
3
4
5
List<Tuple> result = queryFactory
.select(product.category, product.price.avg()) // ์นดํ
๊ณ ๋ฆฌ, ํ๊ท ๊ฐ๊ฒฉ
.from(product)
.groupBy(product.category) // ์นดํ
๊ณ ๋ฆฌ๋ณ
.fetch();
๐ก ์ฌ๋ฌ ๊ฐ์ selectํ๋ฉด ์ํฐํฐ๊ฐ ์๋๋ผ
Tuple๋ก ๋ฐํ๋๋ค.tuple.get(product.category)์ฒ๋ผ ๊บผ๋ธ๋ค.
๐ ์ฃผ์์ฌํญ๊ณผ ํ
โ ๏ธ ์ง๊ณ๋ DB์์ ๊ณ์ฐ๋๋ฏ๋ก, ๋ฐ์ดํฐ๊ฐ ๋ง์ผ๋ฉด ์ฑ๋ฅ์ ์ํฅ์ ์ค๋ค. ํนํ
groupBy๋ ๊ทธ๋ฃน๋ณ๋ก ๋ฌด์์ ๊ฐ์ ธ์ฌ์ง ๋ช ํํ ์ ์ํด์ผ ํ๋ค.
๐ ์ ๋ฆฌ
1
2
3
4
5
QueryDSL ์ง๊ณ
โโ count fetchCount() / .count()
โโ ํต๊ณ sum/avg/min/max
โโ ๊ทธ๋ฃน groupBy(์ปฌ๋ผ) โ Tuple๋ก ๋ฐํ
โโ ์ฃผ์ ๋ฐ์ดํฐ ๋ง์ผ๋ฉด ์ฑ๋ฅ ๊ณ ๋ ค
| ๊ฐ๋ | ํ ์ค ์ ์ |
|---|---|
| ์ง๊ณ ํจ์ | ์ฌ๋ฌ ํ์ ํ๋๋ก ๊ณ์ฐ |
| groupBy | ๊ธฐ์ค๋ณ ๊ทธ๋ฃนํ ํ ์ง๊ณ |
| Tuple | ์ฌ๋ฌ ๊ฐ ์กฐํ ๊ฒฐ๊ณผ |
์ง๊ณ ํจ์๋ SQL์ SUM/AVG/GROUP BY๋ฅผ ํ์
์์ ํ๊ฒ ํํํ ๊ฒ์ด๋ค. ์ฌ๋ฌ ๊ฐ์ selectํ๋ฉด Tuple๋ก ๋ฐ๋๋ค๋ ์ , groupBy๋ ์ฑ๋ฅ์ ์ ์ํด์ผ ํ๋ค๋ ์ ์ ๊ธฐ์ตํ์.
Comments powered by Disqus.