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..
๐๏ธ Spring
์ง๊ณ (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(..
์ ๋ ฌ ์ ๋ ฌ์ orderBy()๋ฅผ ์ฌ์ฉํ์ฌ ์ํํ ์ ์์ต๋๋ค. desc(), asc() : ๋ด๋ฆผ์ฐจ์, ์ค๋ฆ์ฐจ์ nullsLast() : null ์ธ ๊ฒฝ์ฐ ๊ฐ์ฅ ๋ง์ง๋ง์ ์์นํฉ๋๋ค. nullsFirst() : null ์ธ ๊ฒฝ์ฐ ๊ฐ์ฅ ์ฒ์์ ์์นํฉ๋๋ค. setup ์ฝ๋ @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 ..
๊ฒฐ๊ณผ ์กฐํ ๋ฉ์๋ fetch() : ๋ฆฌ์คํธ ์กฐํ, ๋ฐ์ดํฐ ์๋ ๊ฒฝ์ฐ ๋น ๋ฆฌ์คํธ ๋ฐํ fetchOne() : ๋จ ๊ฑด ์กฐํ ๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด null ๊ฒฐ๊ณผ๊ฐ ๋ ์ด์์ด๋ฉด NonUniqueResultException fetchFirst() : limit(1).fetchOne()๊ณผ ๋์ผํฉ๋๋ค. ๋ค์์ QueryDSL 5.0 ๋ฒ์ ์์ Deprecate๋ ๋ฉ์๋์
๋๋ค. fetchResult() : ํ์ด์ง ์ ๋ณด ํฌํจ, total count ์ฟผ๋ฆฌ ์ถ๊ฐ ์คํ fetchCount() : count ์ฟผ๋ฆฌ๋ก ๋ณ๊ฒฝํ์ฌ count ์ ์กฐํ Reference ์ค์ ! Querydsl - ์ธํ๋ฐ | ๊ฐ์ Querydsl์ ๊ธฐ์ด๋ถํฐ ์ค๋ฌด ํ์ฉ๊น์ง, ํ๋ฒ์ ํด๊ฒฐํด๋ณด์ธ์!, ๋ณต์กํ ์ฟผ๋ฆฌ, ๋์ ์ฟผ๋ฆฌ๋ ์ด์ ์๋
! Querydsl๋ก ์๋ฐ ๋ฐฑ์๋..
QueryDSL์ ๊ธฐ๋ณธ ๊ฒ์ ์กฐ๊ฑด ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. @Test @DisplayName("๊ฒ์ ์กฐ๊ฑด ์ฟผ๋ฆฌ EX") fun testSearchQuery() { val eq: BooleanExpression = member.username.eq("member1") //username = "member1" val ne: BooleanExpression = member.username.ne("member1") //username != "member1" val eq_not: BooleanExpression = member.username.eq("member1").not() //username != "member1 val isNotNull: BooleanExpression = member.us..
Q-Type ์ฟผ๋ฆฌdsl์ ์ฌ์ฉํ๋ฉด QType์ ํตํด ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ฒ ๋ฉ๋๋ค. QType์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. Qํด๋์ค ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ new QMember("m") : ๋ณ์นญ(alias)์ ์ง์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์
๋๋ค. JPQL ์คํ ์ select m From Member m ~~ ์์ผ๋ก ์์ฑ๋ฉ๋๋ค. QMember.member : QueryDSL์ด ๊ธฐ๋ณธ์ผ๋ก ์์ฑํด์ฃผ๋ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์
๋๋ค static-import๋ฅผ ์ฌ์ฉํ๋ฉด ๊น๋ํ๊ฒ ์ฌ์ฉํ์ค ์ ์์ต๋๋ค. ๋ณ์นญ์ ์ง์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ๊ฐ์ ํ
์ด๋ธ์ Joinํ๋ ๊ฒฝ์ฐ ํน์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋ณ์นญ ์ง์ ์ง์ @Test @DisplayName("Qํ์
์ง์ ์์ฑํ๊ธฐ") f..
JPA ํ์ค ์์ธ ์ฒ๋ฆฌ JPA์ ํ์ค ์์ธ๋ค์ javax.persistence.PersistenceException์ ์์ ํด๋์ค๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์์ธ ํด๋์ค๋ RuntimeException์ ์์์ด๋ค. JPA ํ์ค ์์ธ๋ ํฌ๊ฒ ๋ณด๋ฉด 2๊ฐ์ง๋ก ๋๋ ์ ์๋ค. ํธ๋์ญ์
๋กค๋ฐฑ์ ํ์ํ๋ ์์ธ ํธ๋์ญ์
์์ธ๋ฅผ ํ์ํ์ง ์๋ ์์ธ ํธ๋์ญ์
๋กค๋ฐฑ์ ํ์ํ๋ ์์ธ๋ ์ฌ๊ฐํ ์์ธ์ด๋ฏ๋ก ๋ณต๊ตฌํด์๋ ์๋๋ค. ์ด ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํธ๋์ญ์
์ ๊ฐ์ ๋ก ์ปค๋ฐํด๋ ํธ๋์ญ์
์ด ์ปค๋ฐ๋์ง ์๊ณ ๋์ ์ javax.persistence.RollbackException ์์ธ๊ฐ ๋ฐ์ํ๋ค. ๋ฐ๋ฉด์ ํธ๋์ญ์
๋กค๋ฐฑ์ ํ์ํ์ง ์๋ ์์ธ๋ ์ฌ๊ฐํ ์์ธ๊ฐ ์๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์๊ฐ ํธ๋์ญ์
์ ์ปค๋ฐํ ์ง ๋กค๋ฐฑํ ์ง๋ฅผ ํ๋จํ๋ค. ์๋๋ ๋ ๊ฐ์ง ๋ถ๋ฅ์ ์์ธ๋ฅผ ํ..
๋ฆฌ์ค๋ ๋ชจ๋ ์ํฐํฐ๋ฅผ ๋์์ผ๋ก ์ธ์ ์ด๋ค ์ฌ์ฉ์๊ฐ ์ญ์ ๋ฅผ ์์ฒญํ๋์ง ๋ชจ๋ ๋ก๊ทธ๋ก ๋จ๊ฒจ์ผ ํ๋ ์๊ตฌ์ฌํญ์ด ์๋ค๊ณ ๊ฐ์ ํ์. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ญ์ ๋ก์ง์ ํ๋ ํ๋ ์ฐพ์๊ฐ๋ฉฐ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๋ ๊ฒ์ ๋๋ฌด ๋นํจ์จ์ ์ด๋ค. ์ด๋ด ๋ JPA์ ๋ฆฌ์ค๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด, ์ํฐํฐ์ ์๋ช
์ฃผ๊ธฐ์ ๋ฐ๋ฅธ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ฒคํธ์ ์ข
๋ฅ ์ด๋ฒคํธ์ ์ข
๋ฅ์ ๋ฐ์ ์์ ์ ๋ค์๊ณผ ๊ฐ๋ค. PostLoad : ์ํฐํฐ๊ฐ ์์์ฑ ์ปจํ
์คํธ์ ์กฐํ๋ ์งํ, ๋๋ refresh๋ฅผ ํธ์ถํ ํ(2์ฐจ ์บ์์ ์ ์ฅ๋์ด ์์ด๋ ํธ์ถ๋๋ค.) PrePersist : persist() ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ
์คํธ์ ๊ด๋ฆฌํ๊ธฐ ์ง์ ์ ํธ์ถ๋๋ค. ์๋ณ์ ์์ฑ ์ ๋ต์ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ์ํฐํฐ์ ์๋ณ์๋ ์กด์ฌํ์ง ์๋ ์ํ์ด๋ค. ์๋ก์ด ์ธ์คํด์ค๋ฅผ mer..