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..
๐๏ธ Spring/QueryDsl
ํ๋ก์ ์
ํ๋ก์ ์
์ 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(..