์กฐ์ธ
๋ด๋ถ ์กฐ์ธ
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 where (select count(o) from Order o where m = o.member) > 0
์๋ธ ์ฟผ๋ฆฌ ์ง์ ํจ์
[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 ํ์
ํํ
๋ฌธ์
์ซ์
10L(Long), 10D(Double), 10F(Float)
Boolean
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
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