본문 바로가기
강의 정리/자바 ORM 표준 JPA

9. 기본 문법

by 이석준석이 2021. 1. 2.

1. JPQL

  • 엔티티 객체 대상으로 하는 객체지향 쿼리 언어다.
  • 특정 SQL에 의존하지 않는다.

TypeQuery : 반환 타입이 명확할 때 사용

TypedQuery<Member> typedQuery = em.createQuery("select m from Member m", Member.class);

 

Query : 반환 타입이 명확하지 않을 때 사용

Query query = em.createQuery("select m.username, m.age from Member m");

결과 조회

  • Collection 인 경우, getResultList();
    • 결과가 없으면 빈 리스트 반환 (NPE 발생하지 않음)
List<Member> members = em.createQuery("select m from Member m", Member.class)
        .getResultList();

 

  • 한개인 경우, getSingleResult();
    • 결과가 정확하게 하나여야 한다.
      • 결과가 없으면 NoResultException
      • 둘 이상이면 NonUniqueResultException
Member findMember = em.createQuery("select m from Member m where m.id = :id", Member.class)
                    .setParameter("id", 1)
                    .getSingleResult();

파라미터 바인딩

  • :column 을 정의한 뒤, setParameter 사용
TypedQuery<Member> query = em.createQuery("select m from Member m where m.username = :username", Member.class);
query.setParameter("username", "member1");
query.getSingleResult();

2. 프로젝션

  • SELECT 절에 조회할 대상을 지정하는 것을 말한다.
  • 가능한 대상은
    • Entity
    • Embedded Type
    • 스칼라 타입

엔티티 프로젝션

  • ex)
    • SELECT m FROM Member m
    • SELECT t FROM Member m join m.team t
  • 엔티티 프로젝션을 한 대상은 모두 영속성 컨텍스트에서 관리된다.

스칼라 타입 프로젝션 3가지 방법

1. Query 타입 조회

List resultList = em.createQuery("select m.username, m.id from Member m")
        .getResultList();

Object[] result = (Object[]) resultList.get(0);
System.out.println("result[0] = " + result[0]); // username
System.out.println("result[1] = " + result[1]); // id

2. Object[] 타입 조회

List<Object[]> resultList = em.createQuery("select m.username, m.id from Member m")
        .getResultList();

Object[] result = resultList.get(0);
System.out.println("result[0] = " + result[0]); // username
System.out.println("result[1] = " + result[1]); // id

3. new 명령어로 조회 (DTO 사용)

  • 생성자 형식으로 받아오기 때문에 new FullpackageClassname() 을 사용하는 것이 불편함
List<MemberDTO> resultList = em.createQuery("select new jpql.MemberDTO(m.id, m.username) from Member m", MemberDTO.class)
        .getResultList();

MemberDTO result = resultList.get(0);
System.out.println("result[0] = " + result.getUsername()); // username
System.out.println("result[1] = " + result.getId()); // id

3. 페이징

  • JPA 는 페이징을 아래의 두개의 API로 추상화한다.
    • setFirstResult(int startPosition) : 조회 시작 위치
    • setMaxResults(int maxResult) : 시작 위치부터 조회할 데이터 수

페이징에서는 order by 가 꼭 들어가야 한다.

List<Member> resultList = em.createQuery("select m from Member m order by m.age desc", Member.class)
        .setFirstResult(0)
        .setMaxResults(10)
        .getResultList();

4. 조인

  • 내부 조인
    • SELECT m FROM Member m [INNER] JOIN m.team t
  • 외부 조인
    • SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
  • 세타 조인
    • SELECT count(m) FROM Member m, Team t where m.username = t.name

ON 절

  • 조인 대상을 사전에 필터링
  • 연관관계 없는 엔티티 외부 조인을 지원한다. 

5. 서브 쿼리

  • exists : 서브쿼리에 결과가 존재하면 참
  • ALL : 모두 만족하면 참
  • ANY, SOME : 조건을 하나라도 만족하면 참
  • IN

FROM 에서는 서브쿼리가 불가능하다.

  • JPA 는 WHERE, HAVING 에서만 가능
  • Hibernate 는 SELECT 절에서도 가능
  • FROM 절의 서브쿼리는 JPQL 에서 불가능

6. 타입 표현

  • 문자 : single quotation
  • 숫자 : 10L(Long)
  • Boolean : TRUE, FALSE
  • ENUM : Full package name 혹은 parameter로 set
  • 타입 (상속관계 시) : TYPE(m) = ?
  • EXISTS, IN
  • AND, OR, NOT
  • =, >, >=, <, <=, <>
  • BETWEEN, LIKE, IS (not) NULL

7. CASE

case when age < 10 then '미만'
     when age >= 10 then '이상'
     else '다 아니면 이거로'
end

 

COALESCE : 하나씩 조회해서 null 이 아니면 반환

  • 이름이 없으면 이름 없는 회원 반환
String query =
        "select coalesce(m.username, '이름 없는 회원') from Member m";

NULLIF : 같으면 null 반환, 없으면 첫번째 값 반환

String query =
        "select nullif(m.username, '이름 없는 회원') from Member m";

8. JPQL 기본 함수

  • CONCAT, SUBSTRING, TRIM, LOWER, UPPER, LENGTH, LOCATE, ABS, SQRT, MOD, SIZE, INDEX

 

 

'강의 정리 > 자바 ORM 표준 JPA' 카테고리의 다른 글

10. 중급 문법  (0) 2021.01.02
8. 값 타입  (0) 2021.01.01
7. 프록시와 연관관계 관리  (0) 2021.01.01
6. 고급 매핑  (0) 2020.12.29
5. 다양한 연관관계 매핑  (0) 2020.12.28