본문 바로가기
JAVA/JPA

인프런 JPA 10화 객체지향 쿼리 언어1 - 기본 문법 "김영한 강사" -PlusUltraCode-

by PlusUltraCode 2024. 7. 20.

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 키워드와 패키지명을 포함하여 작성해야 합니다.

페이징

  • setFirstResultsetMaxResults를 사용하여 페이징 처리
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을 통해 동적 쿼리를 더욱 효율적으로 작성하는 방법을 공부할 예정입니다.