์กฐ์ธ
- ๋ด๋ถ ์กฐ์ธ
- SELECT m FROM Member m [INNER] JOIN m.team t
- ์ธ๋ถ ์กฐ์ธ
- SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
- ์ธํ ์กฐ์ธ
- SELECT count(m) FROM Member m, Team t WHERE m.username = t.name
ON ์
- ON์ ์ ํ์ฉํ ์กฐ์ธ(JPA 2.1๋ถํฐ ์ง์)
- 1. ์กฐ์ธ ๋์ ํํฐ๋ง
- 2. ์ฐ๊ด๊ด๊ณ ์๋ ์ํฐํฐ ์ธ๋ถ ์กฐ์ธ(ํ์ด๋ฒ๋ค์ดํธ 5.1๋ถํฐ)
์กฐ์ธ ๋์ ํํฐ๋ง
- ์) ํ์๊ณผ ํ์ ์กฐ์ธํ๋ฉด์, ํ ์ด๋ฆ์ด A์ธ ํ๋ง ์กฐ์ธ
[JPQL]
SELECT m, t
FROM Member m LEFT JOIN m.team t on t.name = 'A'
[SQL]
SELECT m.*, t.*
FROM Member m LEFT JOIN Team t ON m.TEAM_ID=t.id and t.name='A'
์ฐ๊ด๊ด๊ณ ์๋ ์ํฐํฐ ์ธ๋ถ ์กฐ์ธ
- ์) ํ์์ ์ด๋ฆ๊ณผ ํ์ ์ด๋ฆ์ด ๊ฐ์ ๋์ ์ธ๋ถ ์กฐ์ธ
[JPQL]
SELECT m, t
FROM Member m LEFT JOIN Team t on m.username = t.name
[SQL]
SELECT m.*, t.*
FROM Member m LEFT JOIN Team t ON m.username = t.name
์๋ธ ์ฟผ๋ฆฌ
- ๋์ด๊ฐ ํ๊ท ๋ณด๋ค ๋ง์ ํ์
- select m from Member m
where m.age > (select avg(m2.age) from Member m2)
- select m from Member m
- ํ ๊ฑด์ด๋ผ๋ ์ฃผ๋ฌธํ ๊ณ ๊ฐ
- select m from Member m
where (select count(o) from Order o where m = o.member) > 0
- select m from Member m
์๋ธ ์ฟผ๋ฆฌ ์ง์ ํจ์
- [NOT] EXISTS (subquery): ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์กด์ฌํ๋ฉด ์ฐธ
- {ALL | ANY | SOME} (subquery)
- ALL ๋ชจ๋ ๋ง์กฑํ๋ฉด ์ฐธ
- ANY, SOME: ๊ฐ์ ์๋ฏธ, ์กฐ๊ฑด์ ํ๋๋ผ๋ ๋ง์กฑํ๋ฉด ์ฐธ
- [NOT] IN (subquery): ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์ค ํ๋๋ผ๋ ๊ฐ์ ๊ฒ์ด ์์ผ๋ฉด ์ฐธ
- ์์
#ํA ์์์ธ ํ์
select m from Member m
where exists (select t from m.team t where t.name = 'ํA');
#์ ์ฒด ์ํ ๊ฐ๊ฐ์ ์ฌ๊ณ ๋ณด๋ค ์ฃผ๋ฌธ๋์ด ๋ง์ ์ฃผ๋ฌธ๋ค
select o from Order o
where o.orderAmount > ALL (select p.stockAmount from Product p) ;
#์ด๋ค ํ์ด๋ ํ์ ์์๋ ํ์
select m from Member m
where m.team = ANY (select t from Team t) ;
JPA ์๋ธ ์ฟผ๋ฆฌ ํ๊ณ
- JPA๋ WHERE, HAVING ์ ์์๋ง ์๋ธ ์ฟผ๋ฆฌ ์ฌ์ฉ ๊ฐ๋ฅ
- SELECT ์ ๋ ๊ฐ๋ฅ(ํ์ด๋ฒ๋ค์ดํธ์์ ์ง์)
- FROM ์ ์ ์๋ธ ์ฟผ๋ฆฌ๋ JPQL์์ ๋ถ๊ฐ๋ฅ(ํ์ด๋ฒ๋ค์ดํธ5๊น์ง)
- ์กฐ์ธ์ผ๋ก ํ ์ ์์ผ๋ฉด ํ์ด์ ํด๊ฒฐ
- ํ์ด๋ฒ๋ค์ดํธ6๋ถํฐ๋ FROM์ ์ ์๋ธ์ฟผ๋ฆฌ ์ง์
JPQL ํ์ ํํ
- ๋ฌธ์
- ‘HELLO’, ‘She’’s’
- ์ซ์
- 10L(Long), 10D(Double), 10F(Float)
- Boolean
- TRUE, FALSE
- ENUM
- jpabook.MemberType.Admin (ํจํค์ง๋ช ํฌํจ)
- ์ํฐํฐ ํ์
- TYPE(m) = Member (์์ ๊ด๊ณ์์ ์ฌ์ฉ)
SQL๊ณผ ๋ฌธ๋ฒ์ด ๊ฐ์ ์
- EXISTS, IN
- AND, OR, NOT
- =, >, >=, <, <=, <>
- BETWEEN, LIKE, IS NULL
์กฐ๊ฑด์ (CASE ์)
- ์ฟผ๋ฆฌDSL์ฐ๋ฉด ๋ค ์ง์ํ์ง ๊ฑฑ์ ๋ง๊ธฐ
- ์กฐ๊ฑด์ CASE ์
select
case when m.age <= 10 then 'ํ์์๊ธ'
when m.age >= 60 then '๊ฒฝ๋ก์๊ธ'
else '์ผ๋ฐ์๊ธ'
end
from Member m
- ๋จ์ CASE ์
select
case t.name
when 'ํA' then '์ธ์ผํฐ๋ธ110%'
when 'ํB' then '์ธ์ผํฐ๋ธ120%'
else '์ธ์ผํฐ๋ธ105%'
end
from Team t
- COALESCE: ํ๋์ฉ ์กฐํํด์ null์ด ์๋๋ฉด ๋ฐํ
์ฌ์ฉ์์ด๋ฆ์ด ์์ผ๋ฉด ์ด๋ฆ์๋ํ์ ๋ฐํ
select coalesce(m.username,'์ด๋ฆ ์๋ ํ์') from Member m
- NULLIF: ๋ ๊ฐ์ด ๊ฐ์ผ๋ฉด null ๋ฐํ, ๋ค๋ฅด๋ฉด ์ฒซ๋ฒ์งธ ๊ฐ ๋ฐํ
์ฌ์ฉ์ ์ด๋ฆ์ด '๊ด๋ฆฌ์'๋ฉด null์ ๋ฐํํ๊ณ ๋๋จธ์ง๋ ๋ณธ์ธ์ ์ด๋ฆ์ ๋ฐํ
select NULLIF(m.username, '๊ด๋ฆฌ์') from Member m
JPQL ๊ธฐ๋ณธ ํจ์
- JPQLํ์ค ํจ์๋ก DB ์๊ด์์ด ์ฌ์ฉํ ์ ์์
- CONCAT
- SUBSTRING
- TRIM
- LOWER, UPPER
- LENGTH
- LOCATE
- ABS, SQRT, MOD
- SIZE, INDEX(JPA ์ฉ๋)
- ๋คํํ ์ด ์ธ์ ํจ์๋ ๋ฏธ๋ฆฌ ์ ์๋์ด ์์(DB ์ข ์์ ํจ์)
์ฌ์ฉ์ ์ ์ ํจ์ ํธ์ถ
- ๊ทธ๋ฅ ์ฌ์ฉํ ์๋ ์๊ณ , ํ์ด๋ฒ๋ค์ดํธ๋ ์ฌ์ฉ์ ๋ฐฉ์ธ์ ์ถ๊ฐํ๊ธฐ
- ์ฌ์ฉํ๋ DB ๋ฐฉ์ธ์ ์์๋ฐ๊ณ , ์ฌ์ฉ์ ์ ์ ํจ์๋ฅผ ๋ฑ๋กํ๋ค
select function('group_concat', i.name) from Item i
'๐ฅ๏ธ ๋ฐฑ์๋ > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด - ์ค๊ธ ๋ฌธ๋ฒ(2) (1) | 2023.11.27 |
---|---|
[JPA] ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด - ์ค๊ธ ๋ฌธ๋ฒ(1) (2) | 2023.11.26 |
[JPA] ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด - ๊ธฐ๋ณธ๋ฌธ๋ฒ (1) (1) | 2023.11.26 |
[์คํ๋ง๋ถํธ ํต์คํํธ] ch.5 ์คํ๋ง๋ฐ์ดํฐ JPA (0) | 2023.11.23 |
[์คํ๋ง๋ถํธ ํต์คํํธ] ch.4 JPA API (0) | 2023.11.23 |