๋ฐ˜์‘ํ˜•
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๋ฐฉ์–ธ ์ƒ์† ๋ฐ›๊ณ , ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ๋“ฑ๋ก ํ•„์š”)

 

 


์ฐธ๊ณ 

- ์ฑ…: https://www.coupang.com/vp/products/20488571?itemId=80660090&vendorItemId=3314421212&src=1042503&spec=10304982&addtag=400&ctag=20488571&lptag=10304982I80660090&itime=20220302010946&pageType=PRODUCT&pageValue=20488571&wPcid=16461509863931582782572&wRef=&wTime=20220302010946&redirect=landing&gclid=CjwKCAiApfeQBhAUEiwA7K_UHxuELLbyb9IhdrRf5inlJZLtN8-t8cUswFHeV6fFp-Yd4RThtzZvHxoCPFsQAvD_BwE&campaignid=12207438463&adgroupid=115720946583&isAddedCart= 

๋ฐ˜์‘ํ˜•

+ Recent posts