[JPA] JPQL λ¬Έλ² 3 - κ²½λ‘ ννμ, μλΈ μΏΌλ¦¬, 쑰건μ
by rlaehddnd0422κ²½λ‘ ννμ
κ²½λ‘ ννμμ .μ μ°μ΄ μν°ν° κ°μ κ΄κ³λ₯Ό νννκΈ° μν΄ μ¬μ©λλ ννμμΌλ‘ κ°μ²΄ κ·Έλνλ₯Ό νμνλ μμ μ μ¬μ©λ©λλ€.
- μν νλ : λ¨μν κ°μ μ μ₯νκΈ° μν νλ(νλ‘νΌν°)
- μ°κ΄ νλ : μ°κ΄κ΄κ³λ₯Ό μν νλμ μλ² λλ νμ
- λ¨μΌ κ° μ°κ΄ νλ : @ManyToOne , @OneToOne λ¨μΌ μν°ν° λμ
- 컬λ μ κ° μ°κ΄ νλ : @OneToMany , @ManyToMany 컬λ μ μν°ν° λμ
- μλ² λλ νμ
@Entity
public class Orders {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ORDER_ID")
private Long id; // μν νλ
private int orderAmount; // μν νλ
@Embedded
private Address address; // μ°κ΄νλ ( μλ² λλ νμ
)
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member; // μ°κ΄νλ ( λ¨μΌ μν°ν° )
@ManyToOne
@JoinColumn(name = "PRODUCT_ID")
private Product product; // μ°κ΄νλ ( λ¨μΌ μν°ν° )
}
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MEMBER_ID")
private Long id; // μν νλ
private String name; // μν νλ
private int age; // μν νλ
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team; // μ°κ΄ νλ ( λ¨μΌ μν°ν° )
}
@Entity
public class Team {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "TEAM_ID")
private Long id; // μν νλ
private String name; // μν νλ
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<Member>(); // μ°κ΄ νλ ( μν°ν° 컬λ μ
)
}
- μν νλ μ‘°ν μ μν νλκ° κ²½λ‘ νμμ λμΌλ‘ λ μ΄μ .μΌλ‘ νμν μ μμ΅λλ€. ( m.username, m.age κΉμ§λ§ κ°λ₯ )
- λ¨μΌ κ° μ°κ΄νλ μ‘°ν μ 묡μμ μΌλ‘ λ΄λΆ μ‘°μΈμ΄ λ°μν©λλ€. λ¨μΌ κ° μ°κ΄ κ²½λ‘λ κ³μ νμμ΄ κ°λ₯ν©λλ€. ( o.product.name )
- 컬λ μ
κ° μ°κ΄νλ μ‘°ν μμλ λ§μ°¬κ°μ§λ‘ 묡μμ λ΄λΆ μ‘°μΈμ΄ λ°μν©λλ€. νμ§λ§ λ¨μΌ κ°κ³Ό λ¬λ¦¬ 컬λ μ
κ° μ°κ΄νλ μ‘°νμ κ²½μ° κ³μμ μΈ νμμ΄ λΆκ°λ₯ν©λλ€. ( t.members.name X )
- JPQLμ λ€λ£¨λ©΄μ λ§μ΄ νλ μ€μλ 컬λ μ κ°μμ κ²½λ‘ νμμ μλνλ κ²
- FROM μ μμ μ‘°μΈμ ν΅ν΄ λ³μΉμ μ»μΌλ©΄ λ³μΉμΌλ‘ νμν΄μΌ ν©λλ€.
// 컬λ μ
μ κ³μμ νμμ λΆκ°λ₯
SELECT t.members.name
FROM Team t
// μ‘°μΈμ ν΅ν΄ λ³μΉμ μ»μΌλ©΄ νμν΄μΌ ν¨
SELECT m.name
FROM Team t INNER JOIN t.members m
묡μμ μ‘°μΈ μμ
// JPQL
SELECT m.team ( μ°κ΄κ΄κ³ λ¨μΌ μν°ν° μ‘°ν : 묡μμ λ΄λΆ μ‘°μΈ λ°μ )
FROM Member m
// μ€νλλ SQL
SELECT t
FROM Team t INNER JOIN Member m ON m.team_id = t.id
μλΈ μΏΌλ¦¬
SQLκ³Ό λ§μ°¬κ°μ§λ‘ JPQLλ μλΈ μΏΌλ¦¬λ₯Ό μ§μν©λλ€. λ¨ JPQLμμλ select , from μ μλ μλΈ μΏΌλ¦¬λ₯Ό μ¬μ©ν μ μλ SQLκ³Ό λ¬λ¦¬ where, having μ μλ§ μλΈ μΏΌλ¦¬λ₯Ό μ¬μ©ν μ μμ΅λλ€.
JPQL μλΈ μΏΌλ¦¬ ν¨μ
- 1. [NOT] EXISTS (subquery) : μλΈ μΏΌλ¦¬μ κ²°κ³Όκ° μ‘΄μ¬νλ κ²½μ° μ°Έ 리ν΄, NOT EXISTSμ λ°λ
- select m from Member m where exists (select t from m.team t where t.name = 'νA' )
- -> ν μ΄λ¦μ΄ 'νA'κ° μμμΈ νμ μ‘°ν
- select m from Member m where not exists (select t from m.team t whrer t.name='νA')
- -> ν μ΄λ¦μ΄ 'νA'κ° μλ μμμ νμ μ‘°ν
- 2. [ALL | ANY | SOME] (<,=,>,>=,<=) (subquery)
- ALL 쑰건μ (subquery) : μλΈμΏΌλ¦¬κ° 쑰건μ λͺ¨λ λ§μ‘±νλ©΄ μ°Έ
- select o from Order o where o.orderAmount > ALL (select p.stockAmount from Product p)
- -> λͺ¨λ μνμ μ¬κ³ λλ³΄λ€ μ£Όλ¬Έλμ΄ λ§μ μ£Όλ¬Έλ€ μ‘°ν
- 3. ANY,SOME 쑰건μ (subquery) : μλΈμΏΌλ¦¬κ° 쑰건μ νλλΌλ λ§μ‘±νλ©΄ μ°Έ
- -> select m from Member m where m.team = ANY (select t from Team t)
- -> μ΄λ νμ΄λ νμ μμλ νμ μ‘°ν
- 4. [NOT] IN (subquery)
- μλΈ μΏΌλ¦¬μ κ²°κ³Ό μ€ νλλΌλ κ°μ κ²μ΄ μμΌλ©΄ μ°Έ.
- select t from Team t where t IN (select t2 from Team t2 JOIN t2.members m2 where m2.age >= 20 )
- 20μΈ μ΄μμ 보μ ν ν
쑰건μ
νμ νν
- λ¬Έμλ μμ λ°μ΄νλ‘ κ°μΈμ ννν©λλ€.
- μ«μλ νμ λ³ Longμ κ²½μ° L, Doubleμ κ²½μ° D, Floatμ κ²½μ° Fλ₯Ό λΆμ¬ ννν©λλ€. ex ) 1L,2D,3F
- λ μ§λ DATEμ κ²½μ° {d '2023-05-10'}, TIMEμ κ²½μ° {t '18-17-05'} : 18μ 17λΆ 5μ΄, DATETIMEμ κ²½μ° {ts '2023-05-10 18-17-05.123'}μΌλ‘ νν
- Booleanμ TRUE, FALSEλ‘ νν
μ°μ°μ μ°μ μμ
1. κ²½λ‘ νμ μ°μ° (.)
2. μν μ°μ° : +,-,*,/ λ±
3. λΉκ΅ μ°μ°
4. λ Όλ¦¬ μ°μ°
λ Όλ¦¬μ°μ°κ³Ό λΉκ΅μ
- λΉκ΅μ :>,<, <=, >=, =, <>( λ κ°μ΄ μλ‘ λ€λ₯Έμ§ νλ¨, != μ JPQL λ°©μ νν )
- λ Όλ¦¬ μ°μ° : AND, OR, NOT
Between, IN, LIKE μ
- Between μ: X BETWEEN A AND B β‘οΈ X κ°μ΄ Aμ B μ¬μ΄μ μλ κ²½μ° μ°Έ
- IN μ : X IN (μμ ) β‘οΈ Xμ κ°μ κ°μ΄ μμ μ νλλΌλ μλ κ²½μ° μ°Έ
- LIKE μ : X LIKE [ν¨ν΄ κ°] β‘οΈ Xκ° ν¨ν΄κ°κ³Ό μΌμΉνλ©΄ μ°Έ
- ν¨ν΄ κ° μμ
- '%νμ%' : 'νμ'μ ν¬ν¨ν λ¬Έμμ΄ (νμμΌλ‘ μμ, λλλ κ²λ ν¬ν¨ν©λλ€. ex) κΉνμ, κΉνμκΉ, νμ, νμ1)
- '%νμ' : 'νμ'μΌλ‘ λλλ λ¬Έμμ΄ (ex) κΉνμ, Aνμ)
- 'νμ%' : 'νμ'μΌλ‘ μμνλ λ¬Έμμ΄ (ex) νμ1, νμAA)
- '_νμ' : 'νμ'μΌλ‘ λλλ, μΈλλΌμΈ κ°μλ§νΌλ§ μμ λ¬Έμμ΄λ‘ μ±μμ§ λ¬Έμμ΄ (ex) _νμ : Aνμ, 1νμ )
- 'νμ_' : 'νμ'μΌλ‘ μμνλ, μΈλλΌμΈ κ°μλ§νΌλ§ λ€μ λ¬Έμμ΄λ‘ μ±μμ§ λ¬Έμμ΄ (ex) νμ_ : νμ1, νμA )
- '_νμ_' : 'νμ'μ ν¬ν¨ν λ¬Έμμ΄μ΄λ, μΈλλΌμΈ κ°μλ§νΌλ§ λ¬Έμμ΄λ‘ μ±μμ§ λ¬Έμμ΄ (ex) _νμ__ : 1νμ22, AνμBB)
- ν¨ν΄ κ° μμ
컬λ μ μ
컬λ μ μμ 컬λ μ μλ§ μ¬μ©ν μ μμ΅λλ€.
(컬λ μ κ° μ°κ΄κ²½λ‘) IS [NOT] EMPTY
- 컬λ μ μ΄ λΉμ΄μλ κ²½μ° μ°Έ , NOTμ λΉμ΄μμ§ μμ κ²½μ° μ°Έ
- SELECT m FROM Member m WHERE m.orders is not empty
- -> μ£Όλ¬Έμ΄ νλλΌλ μλ νμ μ‘°ν
(μν°ν° or κ°) [NOT] member of (컬λ μ κ° μ°κ΄κ²½λ‘)
- μν°ν°λ κ°μ΄ 컬λ μ μ ν¬ν¨λμ΄ μμΌλ©΄ μ°Έ
- SELECT t FROM Team t where :memberParam member of t.members
- -> memberParamμ΄ t.membersμ λ©€λ² μ€ νλμΈ λͺ¨λ νμ μ ν
μ€μΉΌλΌ μ
μ€μΉΌλΌλ μ«μ, λ¬Έμ, λ μ§, case, μν°ν° νμ κ°μ κ°μ₯ κΈ°λ³Έμ μΈ νμ λ€μ λλ€.
μ€μΉΌλΌ νμ μ μ¬μ©νλ μμ μμλ΄ μλ€.
λ¬Έμν¨μ
1. concat(λ¬Έμ1,λ¬Έμ2) : λ¬Έμλ₯Ό κ²°ν©
2. substring(λ¬Έμμ΄, μμΉ, κΈΈμ΄) : μμΉλΆν° μμν΄ κΈΈμ΄λ§νΌ substring ꡬνκΈ°
3. upper(λ¬Έμ),lower(λ¬Έμ) : λ¬Έμλ₯Ό λλ¬Έμ, μλ¬Έμλ‘ λ³κ²½
4. length(λ¬Έμ) : λ¬Έμμ΄ κΈΈμ΄ λ¦¬ν΄
5. locate(μ°Ύμλ¬Έμ, μλ³Έ λ¬Έμ, κ²μμμμμΉ) : κ²μμμμμΉλΆν° μμν΄μ μ°Ύμλ¬Έμμ μμ μΈλ±μ€ 리ν΄, λͺ» μ°ΎμΌλ©΄ 0 리ν΄
μνν¨μ
1. abs(μ) : μ λκ° λ¦¬ν΄
2. sqrt(μ) : μ κ³±κ·Ό 리ν΄
3. mod(μνμ, λλ μ ) : λλ¨Έμ§ λ¦¬ν΄
4. size(컬λ μ κ° μ°κ΄ κ²½λ‘μ) : 컬λ μ μ ν¬κΈ° 리ν΄
5. index(λ³μΉ) : 컬λ μ νμ μ μμΉκ° λ¦¬ν΄ ex) t.members m where index(m) > 3
λ μ§ν¨μ
1. CURRENT_DATE : νμ¬ λ μ§
2. CURRENT_TIME : νμ¬ μκ°
3. CURRENT_TIMESTAMP : νμ¬ λ μ§μ μκ°
μ’ λ£ μ΄λ²€νΈ μ‘°ν
SELECT e
FROM Event e
WHERE e.endDate < CURRENT_DATE
CASE μ
νΉμ 쑰건μ λ°λΌ λΆκΈ°ν λ CASE μ μ¬μ©.
1. κΈ°λ³Έ CASE
λ¬Έλ²
CASE
[when <쑰건μ> them <μ€μΉΌλΌμ>}
...
ELSE <μ€μΉΌλΌμ>
END
μ¬μ© μμ
SELECT
CASE WHEN m.age <= 10 then 'νμμκΈ'
WHEN m.age >=60 then 'κ²½λ‘μκΈ'
else 'μΌλ°μκΈ'
END
FROM Member m
2. μ¬ν CASE
μλ°μ switch caaseλ¬Έκ³Ό λΉμ·ν©λλ€. 쑰건 λμμ μ¬μ©ν κ²½μ°
CASE <쑰건λμ>
[when <μ€μΉΌλΌμ1> then <μ€μΉΌλΌμ2>}
ELSE <μ€μΉΌλΌμ>
END
μ¬μ© μμ
SELECT
CASE t.name
WHEN 'νA' then 'μΈμΌν°λΈ100%'
WHEN 'νB' then 'μΈμΌν°λΈ120%'
else 'μΈμΌν°λΈ105%'
END
FROM Team t
3. COALESCE
μ€μΉΌλΌμμ μ°¨λ‘λλ‘ μ‘°νν΄μ nullμ΄ μλλ©΄ 리ν΄
λ¬Έλ²
COALESCE(<μ€μΉΌλΌμ>, {<μ€μΉΌλΌμ>}+)
μ¬μ©μμ
m.usernameμ΄ nullμ΄λ©΄ 'μ΄λ¦ μλ νμ'μ 리ν΄
SELECT coalesce(m.username,'μ΄λ¦ μλ νμ')
FROM Member m
4. NULLIF
λ¬Έλ²
μ€μΉΌλΌμ λ κ°λ₯Ό λΉκ΅ν΄μ λ κ°μ΄ κ°μΌλ©΄ nullμ 리ν΄, λ€λ₯΄λ©΄ 첫 λ²μ§Έ κ°μ 리ν΄
NULLIF (<μ€μΉΌλΌμ>, <μ€μΉΌλΌμ>)
μ¬μ©μμ
SELECT NULLIF(m.username,'κ΄λ¦¬μ')
FROM Member m
m.usernameμ΄ κ΄λ¦¬μμ΄λ©΄ null 리ν΄, else m.username 리ν΄
<μ°Έκ³ μλ£>
'π Backend > Spring Data JPA' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
λΈλ‘κ·Έμ μ 보
Study Repository
rlaehddnd0422