์Šคํ”„๋ง

์Šคํ”„๋ง๊ณผ JPA๋ฅผ ์ด์šฉํ•œ ์›น๊ฐœ๋ฐœ_JQPL

JANNNNNN 2024. 3. 29. 11:26

๐Ÿค”JPQL์˜ ํŠน์ง•์„ ์•Œ์•„๋ณด์ž !

1. Polymorphism

  • book๊ณผ blogpost๋ฅผ ํฌํ•จํ•˜๋Š” publication ์กฐํšŒ ๊ฐ€๋Šฅ(book๋„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์กฐํšŒ ๊ฐ€๋Šฅ)
  • SELECT p FROM Publication p
  • SELECT b FROM BlogPost b

2. Restriction

  • where์—์„œ ์กฐ๊ฑด ๊ฑธ๊ธฐ(๊ฒ€์ƒ‰ ๋Œ€์ƒ ์ œํ•œ)
SELECT a FROM Author a WHERE a.firstName like ‘%and%’ and a.id >= 20 and size(author.books) >= 5

3. Projection

  • ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์ปฌ๋Ÿผ์ด ์•„๋‹Œ ํŠน์ • ๊ฐ’(์ปฌ๋Ÿผ) ๋งŒ ์ง€์ •ํ•ด์„œ ์กฐํšŒ
  • Projection์€ ๋‹ค์–‘ํ•œ ๋Œ€์ƒ์— ์ ์šฉ ๊ฐ€๋Šฅ
  • Entities๋งŒ๋„ ๋ฝ‘์•„๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ!
    • SELECT a FROM Author a
  • Scalar values
    • SELECT a.firstName, a.lastName FROM Author a
  • Constructor references(DTO์— ๋งคํ•‘)
    • SELECT new org.thoughts.on.java.model.AuthorValue(a.id, a.firstName, a.lastName) FROM Author a

4. Distinct query results

  • ์ค‘๋ณต๋˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์กฐํšŒ
  • SELECT DISTINCT a.lastName FROM Author a

5. Function

  • upper(String s) 
  • lower(String s)
  • current_date()
  • current_time()
  • current_timestamp()
  • โžก๏ธSQL์—์„œ๋„ ์ด๋Ÿฌํ•œ Function์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ JPQL์—์„œ๋„ ๋˜‘๊ฐ™์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•จ!

6. Ordering - The ORDER BY clause

  • ์ •๋ ฌ ๋ฐฉ์‹ ์ง€์ •: ascending (ASC) or a descending (DESC) order
  • SELECT a FROM Author a ORDER BY a.lastName ASC, a.firstName DESC

Join๋„ ๊ฐ€๋Šฅํ•˜๋‹ค!

1. Inner Joins

SELECT a, b FROM Author a JOIN a.publications b

โš ๏ธInner Joins์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ publication์ด ์•„๋‹ˆ๋ผ a.publication์ด์–ด์•ผ ํ•จ !!

    ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜์‹œ๊ฒ ์ฃ  ?

  • FROM ์ ˆ์€ select ๋Œ€์ƒ์ด ๋˜๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • Author ์—”ํ‹ฐํ‹ฐ๊ฐ€ Hibernate์— publications ์—”ํ‹ฐํ‹ฐ์™€ ์–ด๋–ป๊ฒŒ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ๋ฏ€๋กœ ์ถ”๊ฐ€์ ์ธ ON์ ˆ์ด ํ•„์š” ์—†์Œ
  • ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์€ ์—”ํ‹ฐํ‹ฐ๊ฐ„ ์กฐ์ธ์€ JPA์—์„œ ์ œ๊ณตํ•˜์ง€ ์•Š์Œ. ๋Œ€์‹  ์„ธํƒ€ ์กฐ์ธ์™€ WHERE์ ˆ์„ ์ด์šฉํ•˜์—ฌ ์กฐ์ธ์„ ์ˆ˜ํ–‰
SELECT b, p FROM Book b, Publisher p WHERE b.fk_publisher = p.id

2. Left Outer Joins

  • ์—ฐ๊ด€๊ด€๊ณ„ ์—ฌ๋ถ€์™€ ์ƒ๊ด€ ์—†์ด ๋Œ€์ƒ ์—”ํ‹ฐํ‹ฐ๋Š” ๋ชจ๋‘ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ
    • ์ด์ „ ์˜ˆ์ œ์˜ INNER์กฐ์ธ์€ publication ์ด๋ ฅ์ด ์žˆ๋Š” Author๋งŒ ์กฐํšŒ๋œ๋‹ค๋ฉด Left Outer ์กฐ์ธ์€ publication ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๋ชจ๋‘ ์กฐํšŒ
    • SELECT a, b FROM Author a LEFT JOIN a.publications b

3. Additional Join Conditions

  • JPA 2.1๋ถ€ํ„ฐ INNER ์กฐ์ธ์˜ ON์ ˆ ์ง€์›

4. Join Fetch

  • ๋Œ€์ƒ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์—ฐ๊ด€ ์—”ํ‹ฐํ‹ฐ๋„ ํ•จ๊ป˜ ์กฐํšŒ
  • FetchType์„ Lazy๋กœ ๋‘๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€๋งŒ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
  • ์ด๋•Œ, Join Fetch์‚ฌ์šฉ
  • ์•„๋ž˜๋Š” ํƒ€์ž…์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ Query์ƒ์„ฑ๊ณผ ์‹คํ–‰์„ ์ฒด์ด๋‹ ํ˜•ํƒœ๋กœ ์ˆ˜ํ–‰

๐Ÿ˜ถ์˜ˆ์ œ : Join Fetch์„ ํ™œ์šฉํ•ด๋ณด์ž!

๊ทธ.์ „.์— ๋ฐ˜ํ™˜ํƒ€์ž…์„ ์ง€์ •ํ•œ JPQL์„ ์‚ฌ์šฉํ•˜๊ณ  ์ฟผ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด SELECT๋ฌธ์ด 2๋ฒˆ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด ์ด์œ ๋Š” Person์ด LAZY์ด๊ธฐ ๋•Œ๋ฌธ์— query.getResultList()๊ฐ€ ์‹คํ–‰๋  ๋•Œ 1๋ฒˆ, forEach๋ฌธ์œผ๋กœ ์‹คํ–‰๋  ๋•Œ ์—ฐ๊ด€๊ด€๊ณ„์ธ address๊นŒ์ง€ 1๋ฒˆ ๋” ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

โžก๏ธ์ด๋Š” ์„ฑ๋Šฅ์— ์น˜๋ช…ํƒ€๋ฅผ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ตœ๋Œ€ํ•œ SELECT๋ฌธ์„ ์ตœ์†Œํ•œ์œผ๋กœ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

โš ๏ธํ•˜์ง€๋งŒ fetchType์„ EAGER์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์— ๋” ์•ˆ์ข‹๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿด๋•Œ Join Fetch๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค!

join fetch p.addresses๋กœ ๊ฐ€์ ธ์˜ค๋ฉด SELECT๋ฌธ์ด 1๋ฒˆ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!

๊ทธ.๋Ÿฌ.๋‚˜.. ์ด๋ฒˆ์—๋Š” ๊ฐ’์˜ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•œ๋‹ค. 

โžก๏ธ์ด๋Ÿด ๋•Œ์—๋Š” distinct๋ฅผ ์‚ฌ์šฉํ•˜์ž!

distinct๋ฅผ ์‚ฌ์šฉ ํ›„ ์ค‘๋ณต์ด ์—†์–ด์กŒ๋‹ค.

์ •๋ฆฌํ•ด๋ณด์ž

  1. oneToMany๋“  manyToOne์ด๋“  ๊ทธ๋ƒฅ LAZY๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์šด์˜ํ•˜๋Š” ๊ด€์ ์—์„œ ์‰ฝ๋‹ค.
  2. ๊ทธ๋Ÿฌ๋‚˜ ํ•œ๋ฒˆ์— ์—ฐ๊ด€๊ด€๊ณ„ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•ด์•ผํ•  ๋•Œ์—๋Š” join fetch๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•จ๊ป˜ ์กฐํšŒํ•ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  3. ๊ทธ๋ฆฌ๊ณ  oneToMany ๊ฒฝ์šฐ์—๋Š” join๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— distinct๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.