Post

[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๋Š” ์„ฑ๋Šฅ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์ž.

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

Comments powered by Disqus.