728x90
์กฐ์ธ
์กฐ์ธ์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
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)๊ณผ ๊ฐ์ ํ์(select) ์กฐํ
* (ํฌ๋ก์ค์กฐ์ธ ๋ฐ์ - ์นด๋ฅดํ
์์ ๊ณฑ)
*
* ๋จ, ์ด ๊ฒฝ์ฐ์๋ ์ธ๋ถ ์กฐ์ธ ๋ถ๊ฐ๋ฅ
*/
@Test
fun thetaJoin() {
em.persist(Member(username = "teamA"))
em.persist(Member(username = "teamB"))
val fetch = query
.select(member)
.from(member, team)
.where(member.username.eq(team.name))
.fetch()
}
from ์ ์ ์ฌ๋ฌ Qํ์ ์ ๋์ดํด์ ์ธํ ์กฐ์ธ์ ํ ์ ์์ต๋๋ค.
์ธํ ์กฐ์ธ ์์๋ ์ธ๋ถ ์กฐ์ธ์ด ๋ถ๊ฐ๋ฅํ๊ณ ์ค์ง inner join๋ง ๊ฐ๋ฅํฉ๋๋ค.
๋ง์ฝ ์ธ๋ถ ์กฐ์ธ์ด ํ์ํ๋ค๋ฉด on์ ์ฌ์ฉํ์ฌ์ผ ํฉ๋๋ค.
ON์
on์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์กฐ์ธ ๋์ ํํฐ๋ง
- ON์ ์ ์กฐ์ธํ ๋์์ ํํฐ๋งํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค. where๋ ์กฐ์ธ ํ ํํฐ๋ง์ ๋๋ค
- inner join์์ ์ฌ์ฉํ ๊ฒฝ์ฐ where๊ณผ on์ ๊ฒฐ๊ณผ๊ฐ ๋์ผํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ต์ํ where์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
- ์ฐ๊ด๊ด๊ณ ์๋ ์ํฐํฐ ์ธ๋ถ ์กฐ์ธ (์ธ๋ถ ์ธํ ์กฐ์ธ)
์กฐ์ธ ๋์ ํํฐ๋ง
/**
* JoinOn์
*
* 1. ์กฐ์ธ ๋์ ํํฐ๋ง (inner join์ ๊ฒฝ์ฐ where๊ณผ ๊ฒฐ๊ณผ๊ฐ ๋์ผํ๋ฏ๋ก, ์ด ๊ฒฝ์ฐ์๋ ์ต์ํ where์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์)
* 2. ์ฐ๊ด๊ด๊ณ๊ฐ ์๋ ์ํฐํฐ๋ฅผ ์ธ๋ถ ์กฐ์ธ
*
* ํ์๊ณผ ํ์ ์กฐ์ธํ๋ฉด์, ํ ์ด๋ฆ์ด teamA์ธ ํ๋ง ์กฐํ, ํ์์ ๋ชจ๋ ์กฐํ
* JPQL : select m, t from Member m left join m.team t on t.name = 'teamA'
*/
@Test
fun joinOn_filtering() {
val fetch = query
.select(member, team)
.from(member)
.leftJoin(member.team, team)
.on(team.name.eq("teamA"))
.fetch()
fetch!!.forEach { println(it) }
}
์ฐ๊ด๊ด๊ณ ์๋ ์ํฐํฐ ์ธ๋ถ ์กฐ์ธ
/**
* ์ธํ์กฐ์ธ์ ์ธ๋ถ์กฐ์ธ์ด ์๋จ
*
* ํ์์ ์ด๋ฆ์ด ํ ์ด๋ฆ(from)๊ณผ ๊ฐ์ ํ์(select)๊ณผ ํ ์ธ๋ถ์กฐ์ธ
*/
@Test
fun joinOn_no_relation() {
em.persist(Member(username = "teamA"))
em.persist(Member(username = "teamB"))
em.flush()
em.clear()
val fetch = query
.select(member, team)
.from(member)
.leftJoin(team)//membet.team , team์ด ์๋ ๊ฒ์ ์ฃผ์
.on(member.username.eq(team.name))
.fetch()
fetch!!.forEach { println(it) }
}
ํด๋น ๊ฒฝ์ฐ leftJoin()์ ์ธ์๋ก ์ํฐํฐ๊ฐ ํ๋๋ง ๋ค์ด๊ฐ๋๋ค.
ํ์น ์กฐ์ธ
join() ์ดํ fetchJoin()์ ๋ถ์ฌ์ฃผ์ด ์ฌ์ฉํฉ๋๋ค.
@PersistenceUnit
lateinit var emf: EntityManagerFactory
/**
* ํ์น ์กฐ์ธ
*/
@Test
fun fetchJoin() {
em.flush()
em.clear()
val findMember = query.selectFrom(member)
.join(member.team, team).fetchJoin()
.where(member.username.eq("member1"))
.fetchOne()
val loaded = emf.persistenceUnitUtil.isLoaded(findMember!!.team)
assertThat(loaded).`as`("ํ์น ์กฐ์ธ ์ ์ฉ").isTrue
Reference
728x90
'๐๏ธ Spring > QueryDsl' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[QueryDSL] CASE ๋ฌธ (0) | 2021.12.23 |
---|---|
[QueryDSL] ์๋ธ ์ฟผ๋ฆฌ (0) | 2021.12.23 |
[QueryDSL] GroupBy (0) | 2021.12.23 |
[QueryDSL] ์ง๊ณ ํจ์(count, sum, avg, max, min) (0) | 2021.12.23 |
[QueryDSL] ์ ๋ ฌ - orderBy() (0) | 2021.12.23 |