JPQL 소개
가장 단순한 조회 방법
- EntityManager.find()
- EntityManager.find() 메서드는 단순한 조회에 적합합니다.
- 예를 들어, 특정 ID를 가진 엔티티를 조회할 수 있습니다.
- 하지만 더 복잡한 조건을 적용한 조회에는 한계가 있습니다.
- 예: 나이가 18세 이상인 남자를 조회하는 등의 조건을 적용할 수 없습니다.
JPQL (Java Persistence Query Language)
- 복잡한 조건을 적용한 조회를 위해 도입되었습니다.
- 특징: JPQL은 검색 쿼리이며, 검색 시 테이블이 아닌 엔티티 객체를 대상으로 검색해야 합니다.
- JPQL은 엔티티 객체를 대상으로 쿼리를 작성하는 반면, SQL은 데이터베이스 테이블을 대상으로 쿼리를 작성합니다.
JPQL 예시
var result = em.createQuery("select m from Member m where m.username like '%kim%'").getResultList();
for (Member member : result) {
// 처리 로직
}
- JPQL만으로 동적 쿼리를 작성하기 어렵기 때문에 대안으로 Criteria API가 존재하지만, 실무에서는 거의 사용되지 않습니다.
- 실무에서는 주로 QueryDSL을 사용합니다. 이는 다음 시간에 공부할 예정입니다.
JPQL 상세 학습
TypedQuery 사용 예시
- 반환 타입을 명시할 수 있습니다.
TypedQuery<Member> query = em.createQuery("Select m from Member m", Member.class);
List<Member> resultList = query.getResultList();
단일 결과 반환
- 하나의 결과만 반환하는 경우:
Member result = em.createQuery("select m from Member m where m.username = :username", Member.class)
.setParameter("username", "dongho")
.getSingleResult();
여러 타입 반환
- 반환할 타입이 여러 개인 경우 Query를 사용합니다.
Query query = em.createQuery("select m.username, m.age from Member m");
- 반환값은 Object[] 배열입니다.
- DTO를 사용하여 반환하는 경우:
MemberDto member = em.createQuery("select new jpql.MemberDto(m.username, m.age) from Member m", MemberDto.class);
- new 키워드와 패키지명을 포함하여 작성해야 합니다.
페이징
- setFirstResult와 setMaxResults를 사용하여 페이징 처리
List<Member> result = em.createQuery("select m from Member m order by m.age desc", Member.class)
.setFirstResult(0) // 시작 인덱스
.setMaxResults(10) // 가져올 결과 개수
.getResultList();
조인
- 내부 조인 (Inner Join)
String query = "select m from Member m join m.team t"; // inner 생략 가능
- 외부 조인 (Outer Join)
String query = "select m from Member m left join m.team t"; // outer 생략 가능
- 세타 조인 (Theta Join)
String query = "select m from Member m, Team t where m.username = t.name";
- 특정 조건에 따른 조인
String query = "select m from Member m left join m.team t on t.name = 'teamA'";
- 세타 조인에서 특정 조건에 따른 조인
String query = "select m from Member m left join Team t on m.username = t.name";
Enum 타입 조회
- Enum 타입은 패키지명까지 명시해야 합니다.
String query = "select m from Member m where m.type = jpql.MemberType.ADMIN";
상속관계 조회
- 상속관계에 있는 타입 조회:
String query = "select i from Item i where type(i) = Book";
조건문
- JPQL의 조건문 예시:
String query = "select case when m.age <= 10 then '학생요금' when m.age >= 60 then '경로요금' else '일반요금' end from Member m";
- 조건문을 활용하여 다양한 요금제를 적용할 수 있습니다.
마무리
- 위 내용을 통해 JPQL의 기본적인 사용법과 특징을 학습하였습니다.
- 다음 시간에는 QueryDSL을 통해 동적 쿼리를 더욱 효율적으로 작성하는 방법을 공부할 예정입니다.
'JAVA > JPA' 카테고리의 다른 글
인프런 JPA 9화 값 타입 "김영한 강사" -PlusUltraCode- (1) | 2024.07.24 |
---|---|
인프런 JPA 8화 프록시와 연관관계 관리 "김영한 강사" -PlusUltraCode- (0) | 2024.07.23 |
인프런 JPA 7화 고급 매핑 "김영한 강사" -PlusUltraCode- (0) | 2024.07.20 |
인프런 JPA 6화 다양한 연관관계 매핑 "김영한 강사" -PlusUltraCode- (0) | 2024.07.20 |
인프런 JPA 5화 연관관계 매핑 기초 "김영한 강사" -PlusUltraCode- (0) | 2024.07.20 |