resultList = em.createQuery(jpql, Member.class) .getFirstResult(10) .getMaxResults(20) .getResultList();"> resultList = em.createQuery(jpql, Member.class) .getFirstResult(10) .getMaxResults(20) .getResultList();"> resultList = em.createQuery(jpql, Member.class) .getFirstResult(10) .getMaxResults(20) .getResultList();">
<aside> ❗
굉장히 다양한 쿼리를 조회할 수 있어야 함
→ JPA로 한계가 있음
JPQL
- 대부분 JPQL로 해결이 됨QueryDSL
**** JPQL만 잘 사용하면 QueryDSL 사용하기 쉬움 ****
</aside>
<aside> ❗
엔티티 객체를 중심으로 개발
테이블이 아닌 엔티티 객체를 대상으로 검색
필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요
</aside><aside> ❗
엔티티 객체를 대상으로 쿼리
→ JPQL을 사용하면 SQL로 번역되어 실행됨테이블을 대상으로 쿼리
// 엔티티 대상으로 쿼리
String jpql = "select m From Member m where m.name like '%kim%'";
List<Member> result = em.createQuery(jpql, Member.class)
.getResultList();
/*
// 테이블 대상 쿼리로 번역된 후 실행
select
m1_0.MEMBER_ID,
m1_0.city,
m1_0.street,
m1_0.zipcode,
m1_0.name
from
Member m1_0
where
m1_0.name like '%kim%'
*/
</aside>
<aside> ❗
객체를 대상으로 검색하는 객체 지향 쿼리
SQL을 추상화해서 특정 데이터베이스 SQL에 의존 X
객체 지향 SQL
String jpql = "select m FROM Member m where m.age > 18";
List<Member> result = em.createQuery(jpql, Member.class)
.getResultList();
/*
SELECT
m.id as id,
m.age as age,
m.USERNAME as USERNAME,
m.TEAM_ID as TEAM_ID
FROM
Membmer m
WHERE
m.age > 18;
*/
</aside>
<aside> ❗
문자열이므로 신경 쓸게 많음 (공백 등등)
→ 실수를 많이하게 됨컴파일이 오류를 잡아준다.
→ 동적 쿼리 작성하기 편함
단점 : 너무 복잡하고 실용성이 없다.
QueryDSL 사용 권장
-> 유지 보수 어려움// Criteria 소개
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> query = cb.createQuery(Member.class);
// 루트 클래스
Root<Member> m = query.from(Member.class);
// 쿼리 생성
CriteriaQuery<Member> cq = query.select(m).where(cb.equal(m.get("username"),
"kim"));
List<Member> resultList = em.createQuery(cq).getResultList()l
</aside>
<aside> ❗
컴파일 시점에 문법 오류를 찾을 수 있음
동적 쿼리 작성 편리
함단순하고 쉬움
JPQL과 거의 1 : 1실무 사용 권장**
****JPAFactoryQuery query = new JPAQueryFactory(em);
QMember m = QMember.member;
List<Member> list =
query.selectFrom(m)
.where(m.age.at(18))
.orderBy(m.name.desc())
.fetch();
</aside>
<aside> ❗
SQL을 직접 사용하는 기능
특정 데이터베이스에 의존적인 기능
String sql =
"SELECT ID, AGE, TEAM_ID, NAME FROM MEMBER WHERE NAME = 'KIM'";
List<Member> resultList =
em.createNativeQuery(sql, Member.class).getResultList();
</aside>
<aside> ❗
적절한 시점에 강제로 플러시 필요
flush() → JPQL, 쿼리 날아갈 때만 수행됨
→ Jdbc 직접 사용은 flush()가 수행되지 않음
SQL을 실행하기 직전에 영속성 컨텍스트 수동 플러시
</aside>