JPQL
JPQL : Java Persistence Query Language
๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด๋ก, ํ ์ด๋ธ์ ๋์์ผ๋ก ์ฟผ๋ฆฌํ๋ ๊ฒ์ด ์๋๋ผ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌํ๋ค.
SQL์ ์ถ์ํํด์ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค SQL์ ์์กดํ์ง ์๋๋ค.
JPQL์ ๊ฒฐ๊ตญ SQL๋ก ๋ณํ๋๋ค.
๊ธฐ๋ณธ ๋ชจ๋ธ๋ง
ํ๋ก์ ์
SELECT์ ์ ์กฐํํ ๋์์ ์ง์ ํ ์ ์๋ค. ํ๋ก์ ์ ๋์์ผ๋ก ์ํฐํฐ, ์๋ฒ ๋๋ ํ์ , ์ค์นผ๋ผ ํ์ (์ซ์, ๋ฌธ์ ๋ฑ ๊ธฐ๋ณธ ๋ฐ์ดํฐ)์ด ์๋ค.
์ํฐํฐ ํ๋ก์ ์
select m from Member m
select m.team from Member m์ฒ์์ ํ์์ ์กฐํํ๊ณ ๋ ๋ฒ์งธ๋ ํ์๊ณผ ์ฐ๊ด๋ ํ์ ์กฐํํ๋ค. ์ด๋ ๊ฒ ์กฐํํ ์ํฐํฐ๋ ์์์ฑ ์ปจํ ์คํธ์์ ๊ด๋ฆฌ๋๋ค.
๋ ๋ฒ์งธ๋ ๋ค์์ฒ๋ผ ๋ณ๊ฒฝํ ์๋ ์๋ค.
select t from Member m join m.team t์คํ๋๋ ์ฟผ๋ฆฌ๋ ๋๊ฐ๋ค. ์ฐจ์ด์ ์ด๋ผ๊ณ ํ๋ค๋ฉด ๊ฐ๋ฐ์๊ฐ ์ด ์ฟผ๋ฆฌ๋ ์กฐ์ธ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๊ตฌ๋๋ผ๊ณ ์ธ์งํ๋ ๊ฒ ์ ๋๋ค.
์๋ฒ ๋๋ ํ์ ํ๋ก์ ์
select o.address from Order o์๋ฒ ๋๋ ํ์ ์ ๊ฐ ํ์ ์ด๊ธฐ ๋๋ฌธ์ ์กฐํ์ ์์์ ์ด ๋ ์ ์๋ค.
//์๋ชป๋ ์ฟผ๋ฆฌ
select a from Address a์ค์นผ๋ผ ํ์ ํ๋ก์ ์
select m.name, m.age from Member m์ด๋ ๊ฒ ๋ ๊ฐ์ ํ์
์ด ๋ค๋ฅธ ํ๋๋ฅผ ํ๋ก์ ์
ํด์ ํ์
์ ์ง์ ํ ์ ์์ผ๋ฏ๋ก TypeQuery๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
NEW๋ช
๋ น์ด๋ฅผ ํตํ์ฌ ๋ฐ๋ก DTO๋ก ๋ณํํ ์ ์๋ค.
@AllArgsConstructor
@Getter
public class MemberDto {
private String name;
private int age;
}
em.createQuery("select new hellojpa.MemberDto(m.name, m.age) from Member m", MemberDto.class).getResultList();ํจํค์ง ๋ช ์ ํฌํจํ ์ ์ฒด ํด๋์ค๋ช ์ ์ ๋ ฅํด์ผ ํ๋ค.
์์์ ํ์ ์ด ์ผ์ฐจํ๋ ์์ฑ์๊ฐ ํ์ํ๋ค.
ํ์ด์ง
JPA๋ ํ์ด์ง์ ๋ค์ API๋ก ์ถ์ํํ๋ค.
setFirstResult(int startPosition) : ์กฐํ ์์ ์์น(0๋ถํฐ ์์)
setMaxResult(int maxResult) : ์กฐํํ ๋ฐ์ดํฐ ์
em.createQuery("select m from Member m order by m.age desc", Member.class)
.setFirstResult(0)
.setMaxResults(10)
.getResultList();์กฐ์ธ
๋ด๋ถ ์กฐ์ธ
em.createQuery("select m from Member m inner join m.team t where t.name = :teamName", Member.class)
.setParameter("teamName", teamName)
.getResultList();ํ์๊ณผ ํ์ ๋ด๋ถ ์กฐ์ธํด์ teamName์ ์์๋ ํ์์ ์ฐพ๋๋ค. inner๋ ์๋ต ๊ฐ๋ฅํ๋ค.
์ธ๋ถ ์กฐ์ธ
em.createQuery("select m from Member m left outer join m.team t", Member.class)
.getResultList();outer๋ ์๋ต ๊ฐ๋ฅํ๋ค.
์ธํ ์กฐ์ธ
em.createQuery("select m from Member m, Team t where m.name = t.name", Member.class)
.getResultList();ON ์
em.createQuery("select m from Member m left join m.team t on t.name = 'teamA'", Member.class)
.getResultList();ํ์๊ณผ ํ์ ์กฐ์ธํ ๋ ํ์ ์ด๋ฆ์ด "teamA"๋ก ์กฐ์ธ ๋์์ ํํฐ๋งํ ์ ์๋ค.
em.createQuery("select m,t from Member m left join Team t on m.name = t.name")
.getResultList();ํ์์ ์ด๋ฆ๊ณผ ํ์ ์ด๋ฆ์ด ๊ฐ์ ๋์์ ์ธ๋ถ ์กฐ์ธํ๋ค.
์๋ธ ์ฟผ๋ฆฌ
๋์ด๊ฐ ํ๊ท ๋ณด๋ค ๋ง์ ํ์์ ์ฐพ๋๋ค.
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
//์ปฌ๋ ์
๊ฐ ์ฐ๊ด ํ๋์ size ๊ธฐ๋ฅ์ ์ฌ์ฉํด์๋ ๊ฐ๋ฅ
select m from Member m
where m.orders.size > 0์๋ธ ์ฟผ๋ฆฌ ์ง์ ํจ์
[not] exists (subquery)
//ํA์ ์์์ธ ํ์
select m from Member m
where exists (select t from m.team t where t.name = 'ํA')์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์กด์ฌํ๋ฉด ์ฐธ์ด๋ค. not์ ๋ฐ๋
all, any, some (subquery)
//์ ์ฒด ์ํ ๊ฐ๊ฐ์ ์ฌ๊ณ ๋ณด๋ค ์ฃผ๋ฌธ๋์ด ๋ง์ ์ฃผ๋ฌธ๋ค
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)๋น๊ต ์ฐ์ฐ์์ ๊ฐ์ด ์ฌ์ฉํ๋ฉฐ all์ ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํด์ผ ์ฐธ์ด๊ณ any๋ some์ ํ๋๋ผ๋ ๋ง์กฑํ๋ฉด ์ฐธ์ด๋ค.
[not] in (subquery)
//20์ธ ์ด์์ ๋ณด์ ํ ํ
select t from Team t
where t in(select t2 from Team t2 join t2.member m2 where m2.age >= 20)์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์ค ํ๋๋ผ๋ ๊ฐ์ ๊ฒ์ด ์์ผ๋ฉด ์ฐธ์ด๋ค.
CASE ์
๊ธฐ๋ณธ CASE ์
String query = "select " +
"case when m.age<=10 then 'ํ์์๊ธ' " +
" when m.age>=60 then '๊ฒฝ๋ก์๊ธ' " +
" else '์ผ๋ฐ ์๊ธ' " +
"end " +
"from Member m";
em.createQuery(query, String.class)
.getResultList();COALESCE
select coalesce(m.name, '์ด๋ฆ ์๋ ํ์') from Member m์ฌ์ฉ์ ์ด๋ฆ์ด ์์ผ๋ฉด '์ด๋ฆ ์๋ ํ์'์ ๋ฐํํ๋ค.
NULLIF
select nullif(m.name, '๊ด๋ฆฌ์') from Member m์ฌ์ฉ์ ์ด๋ฆ์ด '๊ด๋ฆฌ์'๋ฉด null์ ๋ฐํํ๊ณ ๋๋จธ์ง๋ ์ด๋ฆ์ ๊ทธ๋๋ก ๋ฐํํ๋ค.
Last updated