JPQL (Java Persistence Query Language)
์ค๋ช
ํ
์ด๋ธ ๋์์ผ๋ก ํ ์ธ์ด๊ฐ ์๋, ์ํฐํฐ ๊ฐ์ฒด ๋์์ผ๋ก ์ฟผ๋ฆฌํ ๊ฒ.
SQL์ ์ถ์ํํ์ฌ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค SQL์ ์์กดํ์ง ์์.
JPQL → SQL ์ผ๋ก ๋ณํํจ
๊ฐ์ฒด์งํฅSQL
ํน์ง
-- ์ผ๋ฐ SQL ๋ฌธ
select * from Member as m where m.username = 'coffee' -- ๋ณ์นญ(m)์ ํ์๋ค.
-- JPQL ๋ฌธ
/**
@Entity(name="memeber")
class Memeber {
...
private String username;
}
*/
select m from memeber as m where m.username = 'coffee'
-- → ์ํฐํฐ๋ช
(member)์ผ๋ก ์กฐํํด์ผํ๋ค.
-- → ๊ทธ๋ ์ง ์์ผ๋ฉด ํด๋์ค๋ช
(Member)์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ค. (ํด๋์ค๋ช
์ถ์ฒ)
-- → ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ค.
select m.username from member as m
-- → username ์ ์กฐํ ํ๋ค๋ฉด, ๋ณ์นญ(m)์ ํ์๋ก ์ฌ์ฉํด์ผํจ.
๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์ ๋ (createQuery ์ฌ์ฉ ์)
• TypeQuery: ๋ฐํํ์
(๋ฉ์๋ ๋ฆฌํดํ์
)์ ๋ช
ํํ๊ฒ ์ง์ ํ ์ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ.
• Query: ๋ฐํํ์
(๋ฉ์๋ ๋ฆฌํดํ์
)์ ๋ช
ํํ๊ฒ ์ง์ ํ ์ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ.
๊ฒฐ๊ณผ ์กฐํ API
• query.getResultList(): ๊ฒฐ๊ณผ๊ฐ ํ๋ ์ด์์ผ๋ ๋ฆฌ์คํธ ๋ฐํ
• query.getSingleResult(): ๊ฒฐ๊ณผ๊ฐ ์ ํํ ํ๋, ๋จ์ผ ๊ฐ์ฒด ๋ฐํ.
JPQL ์กฐ์ธ
• ๋ด๋ถ ์กฐ์ธ๊ณผ ์ธ๋ถ์กฐ์ธ
-- ๋ด๋ถ ์กฐ์ธ (INNER JOIN, INNER ์๋ต ๊ฐ๋ฅ)
select m from Member m inner join m.team t where t.name = :teamName
-- ์ธ๋ถ ์กฐ์ธ (LEFT OUTER JOIN, OUTER ์๋ต ๊ฐ๋ฅ)
select m from Member m left join m.team t
-- ์ธํ์กฐ์ธ (์ฐ๊ด๊ด๊ณ ์๋๋ฐ ์กฐ์ธํ๊ณ ์ถ์ ๊ฒฝ์ฐ!!)
select count(m) from Member m, Team t where m.username = t.name
• ์ปฌ๋ ์
์กฐ์ธ
→ ์ผ๋๋ค or ๋ค๋์ผ ๊ด๊ณ ์ฒ๋ผ ์ปฌ๋ ์
์ ์ฌ์ฉํ๋ ๊ณณ์ ์กฐ์ธํ๋ ๊ฒ.
→ ์ผ๋๋ค(=๋ค์ ์ฐ๊ดํ๋ ์ฌ์ฉ) or ๋ค๋์ผ(=์ผ์ ์ฐ๊ดํ๋ ์ฌ์ฉ)
• ์ธํ ์กฐ์ธ
→ where ์ ์ฌ์ฉํ์ฌ ์กฐ์ธ (select count(m) from Memeber m, Team t where m.username = t.name)
• JOIN ON ์ (JPA 2.1 ๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅ)
→ ์ธ๋ถ์กฐ์ธ์์๋ง ์ฌ์ฉ.
• ํ์น ์กฐ์ธ (FETCH JOIN)
→ JPQL์์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ์ ๊ณตํ๋ ๊ธฐ๋ฅ. ์ฐ๊ด๋ ์ํฐํฐ๋ ์ปฌ๋ ์
์ ํ๋ฒ์ ๊ฐ์ด ์กฐํํ๋ ๊ธฐ๋ฅ. join fetch ์ผ๋ก ์ฌ์ฉ.
→ ํ์น์กฐ์ธ ์ฌ์ฉ์, SQL ํ๋ฒ์ผ๋ก ์ฐ๊ด๋ ์ํฐํฐ๋ค์ ํจ๊ป ์กฐํํ ์ ์์ด, SQL ์กฐํ ํ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ ์ต์ ํ๊ฐ ๊ฐ๋ฅํ๋ค.
→ ์ง์ฐ๋ก๋ฉ ์ฌ์ฉ ๋ฐ fetch join ์ ์ฉํ๋๊ฒ์ด ํจ์จ์ .
→ ํ์น์กฐ์ธ์ alias ์ฌ์ฉ์ ๋ชปํ๋ฉฐ, ๋ ์ด์์ ์ปฌ๋ ์
์ ํ์นํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ด์ง API์ ์ฌ์ฉํ ์ ์๋ค...ํ
→ ํ์น์กฐ์ธ์ ๊ฐ์ฒด ๊ทธ๋ํ ์ ์งํ ๋ ์ฌ์ฉํ๋ฉด ํจ๊ณผ์ !
→ ํน์ ๋ฐ์ดํฐ๋ง ํํํด์ผ ํ๋ค๋ฉด ๊ตฌ์ง ํ์น ์กฐ์ธ์ ์ฌ์ฉํ ํ์๋ ์๋ค.
-- fetch join ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, m ๋ฐ m.team ๋ชจ๋ ์กฐํ๋จ.
-- >> JPQL ์
select m from Member m join fetch m.team where m.name = 'AA'
-- >> SQL ์
select
m.*, t.*
from Member m join Team t on m.team_id = t.id
where m.name = 'AA'
-- fetch join ์ด ์๋ ์ผ๋ฐ join ์ ํ๋ ๊ฒฝ์ฐ๋ SQL ์์ ์ด๋ ๊ฒ ๋์ด
-- >> JPQL ์
select m from Member m join m.team
-- >> SQL ์
select
m.*
from Member m join Team t on m.team_id = t.id
• ๋ฌต์์ ์กฐ์ธ
→ join ํค์๋ ์ง์ ์ฌ์ฉ (select ~~ from Member m join m.team t)
→ ์กฐ์ธ์ด ์ผ์ด๋๋ ์ํฉ,,์ ํ๋์ ์์๋ณด๊ธฐ ์ด๋ ต๋ค,,?
• ๋ช
์์ ์กฐ์ธ (์ถ์ฒโญ๏ธ)
→ ๊ฒฝ๋ก ํํ์์ ์ํด ๋ฌต์์ ์ผ๋ก SQL ์กฐ์ธ ๋ฐ์ (๋ด๋ถ ์กฐ์ธ๋ง ๊ฐ๋ฅ) (select m.team from Member m)
์๋ธ์ฟผ๋ฆฌ
where, having ์ ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, select, from ์ ์์๋ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ! (ใ
ใ
)
• EXISTS(๊ฒฐ๊ณผ ์กด์ฌ์ ์ฐธ) → select ~~ where exsist (select t from ~~)
• ALL(๋ชจ๋ ๋ง์กฑ ์ฐธ) → select ~~ where o.number > ALL (select b from ~~)
• ANY(์กฐ๊ฑด์ด ํ๋๋ผ๋ ๋ง์กฑ์ ์ฐธ=SOME) → select ~~ where a.tesm = ANY(select c from ~~)
• IN(์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค ํ๋๋ผ๋ ๊ฐ์ ๊ฐ์ด ์์ผ๋ฉด ์ฐธ) select ~~ where a.count in (select d from ~~)
CASE ์
• COALESCE: ํ๋์ฉ ์กฐํํด์ null ์ด ์๋๋ฉด ๋ฐํ
• NULLIF: ๋ ๊ฐ์ด ๊ฐ์ผ๋ฉด null ๋ฐํ, ๋ค๋ฅด๋ฉด ์ฒซ๋ฒ์งธ ๊ฐ ๋ฐํ
์ฌ์ฉ์ ์ ์ ํจ์
select function('group_concat', name) from ~~
→ ์ฌ์ฉ ์ group_concat์ ์ฌ์ฉํ๋ค๋ ์ ์๋ฅผ ํด์ผ ํจ. (DB๋ฐฉ์ธ ์์ ๋ฐ๊ณ , ์ฌ์ฉ์ ์ ์ ํจ์ ๋ฑ๋ก ํ์)
์ฐธ๊ณ
'๊ฐ๋ฐ > jpa' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ์ฐ๊ด๊ด๊ณ ๋งคํ & ํ๋ก์ (0) | 2022.02.21 |
---|---|
[JPA] ๋ณ๊ฒฝ๊ฐ์ง (save() ์ ํ์ง ์์๋๋ฐ db์ ์ ์ฅ?) (0) | 2022.02.20 |
[JPA] ์์์ฑ ๊ด๋ฆฌ (0) | 2022.02.20 |