๐Ÿ๏ธ Spring/QueryDsl

QueryDSL์—์„œ ๋™์  ์ฟผ๋ฆฌ ์‚ฌ์šฉํ•˜๊ธฐ QueryDSL์—์„œ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. BooleanBuiilder ์‚ฌ์šฉ Where ๋‹ค์ค‘ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ (๊ถŒ์žฅ) BooleanBuilder @Test @DisplayName("BooleanBuilder ๋ฅผ ์‚ฌ์šฉํ•œ ๋™์ ์ฟผ๋ฆฌ") fun testBooleanBuilder() { //given var usernameParam = "member1" var ageParam = 10 val result: List = searchMember1(usernameParam, ageParam) assertThat(result.size).isEqualTo(1) } private fun searchMember1(usernameCond: String?, ageCon..
ํ”„๋กœ์ ์…˜ ํ”„๋กœ์ ์…˜์€ select์ ˆ์— ๋Œ€์ƒ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์„น์…˜ ๋Œ€์ƒ์ด ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ, ๋‘˜ ์ด์ƒ์ธ ๊ฒฝ์šฐ, DTO๋กœ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•์ด ๋ชจ๋‘ ๋‹ค๋ฅด๊ธฐ์— ํ•˜๋‚˜ํ•˜๋‚˜ ์˜ˆ์‹œ๋ฅผ ๋™ํ•ด ์•Œ์•„๊ฐ€๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ์ „์— ์šฐ์„  ํ”„๋กœ์ ์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์ธ @QueryProjection์˜ ์‚ฌ์šฉ๋ฒ•๋ถ€ํ„ฐ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. @QueryProjection @QueryProjection์€ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด DTO๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. DTO์˜ ์ƒ์„ฑ์ž์— @QueryProjection์„ ๋ถ™์—ฌ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. data class MemberDtoQueryProjection @QueryProjection constructor( val username: String, val age: Int, ) ์ดํ›„ ๋นŒ๋“œ ..
์ƒ์ˆ˜ ์ƒ์ˆ˜๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Expressions.constant(์ƒ์ˆ˜)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ /** * ์ƒ์ˆ˜ * Expressions ์‚ฌ์šฉ */ @Test fun testConstant() { //given val fetch = query .select(member.username, Expressions.constant("A")) .from(member) .fetch() fetch.forEach { println(it) } } ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž ๋”ํ•˜๊ธฐ ๊ฒฐ๊ณผ์— ๋ฌธ์ž์—ด์„ ๋”ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. concat() : ๋ฌธ์ž์—ด ๋’ค์— ์ด์–ด์„œ ๋”ํ•ฉ๋‹ˆ๋‹ค. prepend() : ๋ฌธ์ž์—ด์˜ ๋งจ ์•ž์— ๋”ํ•ฉ๋‹ˆ๋‹ค. /** * ๋ฌธ์ž ๋”ํ•˜๊ธฐ * concat * ์•ž์— ๋”ํ• ๋•Œ๋Š” prepend */..
CASE๋ฌธ select, ์กฐ๊ฑด์ ˆ(where), orderBy ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•œ ์กฐ๊ฑด /** * (DB๊ฐ€ ์•„๋‹ˆ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•˜๋Š”๊ฒƒ์„ ์ถ”์ฒœ) * Case ๋ฌธ */ @Test fun testCase() { //given val fetch = query .select( member.age .`when`(10).then("์—ด์‚ด") .`when`(20).then("์Šค๋ฌด์‚ด") .otherwise("๊ธฐํƒ€") ) .from(member) .fetch() fetch.forEach { println(it) } } ๋ณต์žกํ•œ ์กฐ๊ฑด - CaseBuilder ์‚ฌ์šฉ /** * ๋ณต์žกํ•œ Case ๋ฌธ * CaseBuilder ์‚ฌ์šฉ */ @Test fun complexCase() { //given val fetch = ..
์„œ๋ธŒ์ฟผ๋ฆฌ JPAExpressions์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. JPQL๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ from์ ˆ์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด select์ ˆ์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์˜ ์‚ฌํ•ญ ์„œ๋ธŒ์ฟผ๋ฆฌ์™€ ๋ฉ”์ธ์ฟผ๋ฆฌ์˜ ๋ณ„์นญ์ด ๊ฒน์น˜๋ฉด ์•ˆ๋˜๋ฏ€๋กœ, ๊ฐ™์€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, QType์„ ์ƒ์„ฑํ•  ๋•Œ Alias๋ฅผ ์ง์ ‘ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. from์ ˆ์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ ํ•ด๊ฒฐ๋ฐฉ์•ˆ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ join์œผ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค.(๊ฐ€๋Šฅํ• ์ˆ˜๋„, ๋ถˆ๊ฐ€๋Šฅํ• ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฟผ๋ฆฌ๋ฅผ 2๋ฒˆ ๋ถ„๋ฆฌํ•ด์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. nativeSQL์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์˜ˆ์‹œ /** * ์„œ๋ธŒ ์ฟผ๋ฆฌ * com.querydsl.jpa.JPAExpressions ์‚ฌ์šฉ * * ๋‚˜์ด๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ํšŒ์› ์กฐํšŒ */ @Test fun testSubQuer..
์กฐ์ธ ์กฐ์ธ์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. join(์กฐ์ธ ๋Œ€์ƒ, ๋ณ„์นญ์œผ๋กœ ์‚ฌ์šฉํ•  Qํƒ€์ž…) ์ผ๋ฐ˜ ์กฐ์ธ /** * ํŒ€ A์— ์†Œ์†๋œ ๋ชจ๋“  ํšŒ์›(select, from)์„ ์ฐพ๊ธฐ */ @Test fun join() { val fetch = query .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) //.where(member.team.name.eq("teamA")) - ๋˜‘๊ฐ™๋‹ค .fetch() fetch.forEach { println(it) } fetch.forEach { println(it.team) } } ์„ธํƒ€์กฐ์ธ - ์—ฐ๊ด€๊ด€๊ณ„ ์—†๋Š” ์กฐ์ธ /** * ์„ธํƒ€ ์กฐ์ธ - ์—ฐ๊ด€๊ด€๊ณ„ ์—†๋Š” ์กฐ์ธ * * ํšŒ์›์˜ ์ด๋ฆ„์ด ํŒ€ ์ด๋ฆ„(from)๊ณผ ..
GroupBy ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด GroupBy๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. having์„ ํ†ตํ•ด ๊ทธ๋ฃนํ™”๋œ ๊ฒฐ๊ณผ๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์…‹์—… ์ฝ”๋“œ @BeforeEach fun before() { val teamA = Team(name = "teamA") val teamB = Team(name = "teamB") em.persist(teamA) em.persist(teamB) val members = listOf( Member(username = "member1", age = 10, team = teamA), Member(username = "member2", age = 20, team = teamA), Member(username = "member3", age = 30, team = teamB), Memb..
์ง‘๊ณ„ (count, sum, avg, max, min) ์ง‘๊ณ„ ํ•จ์ˆ˜๋Š” ๊ทธ๋ฃน ๋ณ„๋กœ ๊ทธ๋ฃนํ•‘๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. COUNT() : ์ด ๊ฐœ์ˆ˜ SUM() : ํ•ฉ AVG() : ํ‰๊ท  MAX() : ์ตœ๋Œ€๊ฐ’ MIN() : ์ตœ์†Œ๊ฐ’ ์‚ฌ์šฉ ์˜ˆ์‹œ ์…‹์—… ์ฝ”๋“œ @BeforeEach fun before() { val teamA = Team(name = "teamA") val teamB = Team(name = "teamB") em.persist(teamA) em.persist(teamB) val members = listOf( Member(username = "member1", age = 10, team = teamA), Member(username = "member2", age = 20, team = teamA), Member(..
๋ง ๋ž‘
'๐Ÿ๏ธ Spring/QueryDsl' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก