πŸ–₯️ λ°±μ—”λ“œ/SpringBoot

[JPA] 객체지ν–₯ 쿼리 μ–Έμ–΄ - 쀑급 문법(1)

OR15A 2023. 11. 26. 23:00

경둜 ν‘œν˜„식

  • .(점)을 μ°μ–΄ κ°μ²΄ κ·Έλž˜ν”„λ₯Ό νƒμƒ‰ν•˜λŠ” κ²ƒ
select m.username -> μƒνƒœ ν•„λ“œ
  from Member m 
       join m.team t -> 단일 κ°’ μ—°κ΄€ ν•„λ“œ
       join m.orders o -> μ»¬λ ‰μ…˜ κ°’ μ—°κ΄€ ν•„λ“œ
where t.name = 'νŒ€A'
  • λ‚΄λΆ€μ μœΌλ‘œ λ™μž‘ν•˜λŠ” 방식 ꡬ뢄
    • μƒνƒœν•„λ“œ
    • 단일 κ°’ μ—°κ΄€ν•„λ“œ
    • μ»¬λ ‰μ…˜ κ°’ μ—°κ΄€ν•„λ“œ

 

 

경둜 ν‘œν˜„μ‹ μš©μ–΄ 정리 및 μ„€λͺ…

  • μƒνƒœ ν•„λ“œ(state field)
    • λ‹¨μˆœνžˆ 값을 μ €μž₯ν•˜κΈ° μœ„ν•œ ν•„λ“œ (ex: m.username)
    • 경둜 νƒμƒ‰μ˜ λ, νƒμƒ‰X
#단일 κ°’ μ—°κ΄€ 경둜 탐색
[JPQL]
select o.member from Order o;

[SQL]
select m.* 
 from Orders o 
 inner join Member m on o.member_id = m.id;
  • μ—°κ΄€ ν•„λ“œ(association field)
    • 연관관계λ₯Ό μœ„ν•œ ν•„λ“œ
    • 단일 κ°’ μ—°κ΄€ ν•„λ“œ :  @ManyToOne, @OneToOne, λŒ€μƒμ΄ μ—”ν‹°ν‹°(ex: m.team)
      •  λ¬΅μ‹œμ  λ‚΄λΆ€ μ‘°μΈ(inner join) λ°œμƒ, νƒμƒ‰O
#단일 κ°’ μ—°κ΄€ 경둜 탐색
[JPQL]
select o.member from Order o;

[SQL]
select m.* 
 from Orders o 
 inner join Member m on o.member_id = m.id;
 #μ—¬κΈ°μ„œ μƒκΈ°λŠ” λ¬΅μ‹œμ  쑰인은 맀우 μœ„ν—˜.!
  •  
    • μ»¬λ ‰μ…˜ κ°’ μ—°κ΄€ ν•„λ“œ  :  @OneToMany, @ManyToMany, λŒ€μƒμ΄ μ»¬λ ‰μ…˜(ex: m.orders)
      • λ¬΅μ‹œμ  λ‚΄λΆ€ μ‘°μΈ λ°œμƒ, νƒμƒ‰X
      • FROM μ ˆμ—μ„œ λͺ…μ‹œμ  쑰인을 톡해 별칭을 μ–»μœΌλ©΄ 별칭을 톡해 νƒμƒ‰ κ°€λŠ₯
  • λ¬΅μ‹œμ  쑰인 μ‚¬μš© ꢌμž₯ XXX

 

 

λͺ…μ‹œμ§ μ‘°μΈ, λ¬΅μ‹œμ  μ‘°μΈ

  • λͺ…μ‹œμ  쑰인
    • join ν‚€μ›Œλ“œ 직접 μ‚¬μš©
    • select m from Member m join m.team t
  • λ¬΅μ‹œμ  쑰인
    • 경둜 ν‘œν˜„μ‹μ— μ˜ν•΄ λ¬΅μ‹œμ μœΌλ‘œ SQL 쑰인 λ°œμƒ(λ‚΄λΆ€ 쑰인만 κ°€λŠ₯)
    • select m.team from Member m

 

예제

select o.member.team from Order o -> 성곡
select t.members from Team -> 성곡
select t.members.username from Team t -> μ‹€νŒ¨
select m.username from Team t join t.members m -> 성곡

 

싀무 μ‘°μ–Έ

 • 가급적 λ¬΅μ‹œμ  쑰인 λŒ€μ‹ μ— λͺ…μ‹œμ  쑰인 μ‚¬μš©
• 쑰인은 SQL νŠœλ‹μ— μ€‘μš” 포인트
• λ¬΅μ‹œμ  쑰인은 쑰인이 μΌμ–΄λ‚˜λŠ” 상황을 ν•œλˆˆμ— νŒŒμ•…ν•˜κΈ° 어렀움