10.3 Criteria
Criterial 쿼리는 JPQL을 자바 코드로 작성하도록 도와주는 빌더 클래스 API이다
문자가 아닌 코드로 JPQL을 작성하므로 문법 오류를 컴파일 단계에서 잡을 수 있고 문자 기반의 JPQL보다 동적 쿼리를 안전하게 생성할 수 있다
하지만, 코드가 복잡하고 장황해서 직관적으로 이해가 힘들다
10.3.1 Criteria 기초
//JPQL : select m from Member m
CriteriaBuilder db = em.getCriteriaBuilder(); //Criteria 쿼리 빌더 //1번
//Criteria 생성, 반환타입 지정 //2번
CriteriaQuery<Member> cq = cb.createQuery(Member.class);
Root<Member> m = cq.from(Member.class); //FROM 절 //3번
cq.select(m); //SELECT 절 //4번
TypedQuery<Member> query = em.createQuery(cq);
List<Member> members = query.getResultList();
- Criteria 쿼리를 생성하려면 먼저 Criteria 빌더(CriteriaBuilder)를 얻어야 한다. Criteria 빌더는 EntityManager 이나 EntityManagerFactory에서 얻을 수 있다
- Criteria 쿼리 빌더에서 Criteria 쿼리를 생성한다. 이때 반환 타입을 지정할 수 있다
- FROM 절을 생성한다. 반환된 값 m은 Criteria에서 사용하는 특별한 별칭이다. m을 조회의 시작점이라는 의미로 쿼리 루트(Root)라고 한다
- SELECT 절을 생성한다
//JPQL : select m from Member m
//where m.username='회원1'
//order by m.age desc
CriteriaBuilder db = em.getCriteriaBuilder();
CriteriaQuery<Member> cq = cb.createQuery(Member.class);
Root<Member> m = cq.from(Member.class); //FROM 절
//검색 조건 정의 //1번
Predicate usernameEqual = cb.equal(m.get("username"), "회원1");
//정렬 조건 정의 //2번
javax.persistence.criteria.Order ageDesc = cb.desc(m.get("age"));
//쿼리 생성 //3번
cq.select(m)
.where(usernameEqual) //WHERE 절 생성
.orderBy(ageDesc); //ORDER BY 절 생성
List<Member> members = em.createQuery(cq).getResultList();
10.3.3 조회
//한 건 지정
CriteriaQuery<T> select(Selection<? extends T> selection;
//여러 건 지정
CriteriaQuery<T> multiselect(Selection<?>... selection);
//여러 건 지정
CriteriaQuery<T> multiselect(List<Selection<?>> selectionList);
Distinct
//JPQL: select distinct m.username, m.age
cq.multiselect(m.get("username"), m.get("age")).distinct(true);
NEW, construct()
//JPQL: select new jpabook.domain.MemberDTO(m.username, m.age)
//from Memeber m
CriteriaQuery<MemberDTO> cq = cb.createQuery(MemberDTO.class);
Root<Member> m = cq.from(Member.class);
cq.select(cb.construct(MemberDTO.calss, m.get("username"), m.get("age")));
TypedQuery<MemberDTO> query = em.createQuery(cq);
List<MemberDTO> resultList = query.getResultList();
'JPA 프로그래밍' 카테고리의 다른 글
Ch12. 스프링 데이터 JPA (0) | 2025.01.22 |
---|---|
Ch10. 객체 지향 쿼리 언어 (10.5 네이티브 SQL, 10.6 객체지향 쿼리 심화) (0) | 2025.01.21 |
Ch10. 객체지향 쿼리 언어 (10.4 QueryDSL) (0) | 2025.01.21 |
Ch10. 객체지향 쿼리 언어 (10.1 객체지향 쿼리 소개, 10.2 JPQL) (0) | 2025.01.20 |
Ch.9 값 타입 (1) | 2025.01.16 |