[JPA] JPQL ๋ฌธ๋ฒ 4 - ๋คํ์ฑ ์ฟผ๋ฆฌ, ์ํฐํฐ ์ง์ ์ฌ์ฉ, Named ์ฟผ๋ฆฌ
by rlaehddnd0422๋คํ์ฑ ์ฟผ๋ฆฌ
JPQL์ผ๋ก ๋ถ๋ชจ ์ํฐํฐ๋ฅผ ์กฐํํ๋ฉด ์๋์ผ๋ก ๋ชจ๋ ์์ ์ํฐํฐ๊น์ง ํจ๊ป ์กฐํํฉ๋๋ค.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
private int stockQuantity;
}
JPQL
SELECT i
FROM Item i
๋จ์ผ ํ ์ด๋ธ ์ ๋ต์ ์ฌ์ฉํ์ ๋ ์คํ๋๋ SQL
select * from Item i
์กฐ์ธ ์ ๋ต์ ์ฌ์ฉํ์ ๋ ์คํ๋๋ SQL
select
item0_.ITEM_ID as ITEM_ID2_2_,
item0_.name as name3_2_,
item0_.price as price4_2_,
item0_.stockQuantity as stockQua5_2_,
item0_3_.author as author1_1_,
item0_3_.isbn as isbn2_1_,
item0_.DTYPE as DTYPE1_2_
from
Item item0_
left outer join
Album item0_1_
on item0_.ITEM_ID=item0_1_.ITEM_ID
left outer join
Movie item0_2_
on item0_.ITEM_ID=item0_2_.ITEM_ID
left outer join
Book item0_3_
on item0_.ITEM_ID=item0_3_.ITEM_ID
์คํ๋๋ SQL์ ๊ฐ์ด ๋ชจ๋ ์์ ์ํฐํฐ๋ฅผ ์ธ๋ถ ์กฐ์ธํ์ฌ ์กฐํํฉ๋๋ค.
+ ์กฐํ๋์์ ๋ชจ๋ ์์ ์ํฐํฐ๊ฐ ์๋ ํน์ ์์ ์ํฐํฐ๋ก ํ์ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น์?
TYPE์ ์ํฐํฐ์ ์์๊ตฌ์กฐ์์ ์กฐํ๋์์ ํน์ ์์ ํ์ ์ผ๋ก๋ง ํ์ ํ ์ ์์ต๋๋ค.
// JPQL
SELECT i
FROM Item i
where TYPE(i) IN (Book, Movie)
+ JPQL์์ ๋ถ๋ชจ ํ์ ์ ํน์ ์์ ํ์ ์ผ๋ก ๋ค๋ฃฐ ๋, ์ฆ ๋ถ๋ชจ ํ์ ์ ์์ ํ์ ์ผ๋ก ๋ค์ด ์บ์คํ ํด์ ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น์?
JPA 2.1๋ถํฐ TREAT ๋ฌธ์ ์ฌ์ฉํด์ ๋ถ๋ชจํ์ ์ ์์์ผ๋ก ๋ค์ด์บ์คํ ํด์ ๋ค๋ฃฐ ์ ์์ต๋๋ค.
// JPQL
SELECT i
FROM Item i
WHERE treat(i as Book).author = 'kim'
์ํฐํฐ ์ง์ ์ฌ์ฉ
JPQL์์ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์ง์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ด๋ป๊ฒ ๋์ํ ๊น์?
์ฌ๊ธฐ์ ์ง์ ์ฌ์ฉํ๋ค๋ ๋ง์ select m from Member m ์ฒ๋ผ ์ํฐํฐ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ selectํ๋ ๊ฒ์ด ์๋ ์ํฐํฐ ๊ฐ์ฒด ์์ฒด๋ฅผ selectํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
- JPQL : select count(m.id) from Member m // ์ํฐํฐ์ ID๋ฅผ ์ฌ์ฉ
- ์ํฐํฐ์ ํ๋กํผํฐ๋ก ์กฐํ
- JPQL : select count(m) from Member m // ์ํฐํฐ ์์ฒด๋ฅผ ์ง์ ์ฌ์ฉ
- ์ํฐํฐ ๊ฐ์ฒด๋ฅผ JPQL์์ ์ง์ ์ฌ์ฉํ๋ฉด SQL์์๋ ํด๋น ์ํฐํฐ์ ๊ธฐ๋ณธ ํค ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
- ์คํ๋๋ SQL : select count(m.id) as cnt from Member m
- ์ํฐํฐ ๊ฐ์ฒด๋ฅผ JPQL์์ ์ง์ ์ฌ์ฉํ๋ฉด SQL์์๋ ํด๋น ์ํฐํฐ์ ๊ธฐ๋ณธ ํค ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
- JPQL : select m from Member m where m.team =: team
- ์ด ๊ฒฝ์ฐ์ ๋ฌต์์ ๋ด๋ถ ์กฐ์ธ์ด ์ผ์ด๋ ๊ฒ ๊ฐ์ง๋ง, MEMBER ํ ์ด๋ธ์ด team_id ์ธ๋ํค๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ๋ฌต์์ ์กฐ์ธ์ด ์ผ์ด๋์ง ์์ต๋๋ค.
- ์ฆ, ์ํฐํฐ ๊ฐ์ฒด๋ก ์กฐํํ ๋, ๊ธฐ๋ณธํค๊ฐ ์๋ ์ธ๋ํค๋ฅผ ์ฌ์ฉํด์ ์กฐํํ๋ ๊ฒฝ์ฐ์๋ ์กฐํํ๋ ์ํฐํฐ๊ฐ ์ธ๋ํค๋ฅผ ๊ฐ์ง๊ณ ์์ ๋, ๋ฌต์์ ์กฐ์ธ์ด ์ผ์ด๋์ง ์์ต๋๋ค.
- ์ธ๋ํค๊ฐ ์๋ ํ๋กํผํฐ๋ก ์กฐํํ๋ ๊ฒฝ์ฐ(์๋ฅผ๋ค๋ฉด m.team.name)์๋ ๋ฌต์์ ์กฐ์ธ์ด ์ผ์ด๋ฉ๋๋ค.
Named ์ ์ ์ฟผ๋ฆฌ
JPQL์ ํฌ๊ฒ ๋์ ์ฟผ๋ฆฌ์ ์ ์ ์ฟผ๋ฆฌ๋ก ๋๋ ์ ์์ต๋๋ค.
- ๋์ ์ฟผ๋ฆฌ : em.createQuery("select ... ")์ฒ๋ผ JPQL์ ๋ฌธ์๋ก ์์ฑํด์ ์ง์ ๋๊ธฐ๋ ์ฟผ๋ฆฌ ๋ฐฉ์
- ์ ์ ์ฟผ๋ฆฌ : ๋ฏธ๋ฆฌ ์ ์ํ ์ฟผ๋ฆฌ์ ์ด๋ฆ์ ๋ถ์ฌํด์ ํ์ํ ๋ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก Named ์ฟผ๋ฆฌ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
Named ์ฟผ๋ฆฌ ์ฌ์ฉ๋ฒ
1. NamedQuery๋ฅผ ์ด๋ ธํ ์ด์ ์ ์ ์ํฉ๋๋ค.
@Entity
@NamedQuery(name = "myquery1", query = "select ...")
public class Member {
...
}
2. ์ฌ์ฉํ๊ณ ์ถ์ ๊ณณ์ 1์ name์ ๋๊ฒจ์ค๋๋ค.
- ์ด ๋ em.createQuery๊ฐ ์๋ em.createNamedQuery๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
List<Member> resultList = em.createNamedQuery("myQuery", Member.class).getResultList();
ํ ์ํฐํฐ์ ์ฌ๋ฌ๊ฐ์ ์ ์ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๊ฒจ์ฐ์๋ 1์์ @NamedQueries๋ด์ @NamedQuery๋ก ๋ฑ๋กํ๋ฉด ๋ฉ๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > Spring Data JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] Spring Data JPA - ํ์ฅ ๊ธฐ๋ฅ (0) | 2023.05.19 |
---|---|
[JPA] Spring Data JPA - ์ฟผ๋ฆฌ ๋ฉ์๋ ๊ธฐ๋ฅ (0) | 2023.05.18 |
[JPA] JPQL ๋ฌธ๋ฒ 3 - ๊ฒฝ๋ก ํํ์, ์๋ธ ์ฟผ๋ฆฌ, ์กฐ๊ฑด์ (0) | 2023.05.10 |
[JPA] JPQL ๋ฌธ๋ฒ 2 - ์งํฉ ๋ฐ ์ ๋ ฌ, ์กฐ์ธ, ํ์น ์กฐ์ธ (0) | 2023.05.09 |
[JPA] JPQL ๋ฌธ๋ฒ 1 - ๊ธฐ๋ณธ ๋ฌธ๋ฒ, ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ, ํ๋ก์ ์ , ํ์ด์ง (0) | 2023.05.09 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422