[JPA] JPQL 의 기본 문법과 쿼리 API

  • JPQL에서 가능한 문구
    • SELECT , UPDATE , DELETE 문을 사용 가능하다
    • EntityManager.persist() 메서드를 사용하므로, JPQL 자체에는 INSERT 문이 존재하지 않습니다

SELECT 문

SELECT m FROM Member AS m WHERE m.username = 'Hello'
  • 문법의 특징
    1. 대소문자의 구분
      • 엔티티 이름과 속성(필드) 이름은 대소문자를 구분
        • Member , username
      • JPQL 키워드
        • SELECT FROM AS 은 구분 X
    1. 엔티티의 이름
      1. JPQL 의 엔티티 이름은 클래스명이 아니며
      1. @Entity(name="XXX") 로 지정된 엔티티 이름으로 사용
    1. 별칭의 필수성
      1. JPQL 은 AS 키워드를 사용하여 별칭을 지정함
      1. 별칭은 필수
    1. UPDATE 와 DELETE 문은 벌크 연산을 한다
      1. 한번에 많은 수의 레코드를 업데이트하거나 삭제할 떄 사용함

TypedQuery , Query

  • JPQL 을 수행하기 위하여 쿼리 객체가 필요하다.
  • TypedQueryQuery 두 가지 타입의 쿼리 객체를 제공함
  1. TypedQuery
    • 반환할 타입이 명확한 경우 사용
    • 모든 회원의 엔티티 조회의 케이스
      TypedQuery<Member> query = em.createQuery("SELECT m FROM Member m", Member.class);
      List<Member> resultList = query.getResultList();
      for (Member member : resultList) {
          System.out.println("member = " + member);
      }
      member = Member(id=1, name=other, address=null, favoriteFoods=[], addressHistory=[])
      member = Member(id=2, name=null, address=null, favoriteFoods=[], addressHistory=[])
  1. Query 사용
    • 반환 타입이 명확하지 않는 경우 Query 객체를 사용
    • 여러 타입의 컬럼 조회, 반환되는 객체의 타입이 미리 정해지지 않은 경우에 해당
    Query query = em.createQuery("SELECT m.username, m.age FROM Member m");
    List resultList = query.getResultList();
    for (Object o : resultList) {
        Object[] result = (Object[]) o; // 결과가 둘 이상이면 Object[] 반환
        System.out.println("username = " + result[0]);
        System.out.println("age = " + result[1]);
    }
  • 결과 조회 메서드
    • getResultList()
      • 결과를 리스트로 반환
      • 결과가 없으면 빈 리스트로
    • getSingleResult()
      • 결과가 정확히 하나인 경우
      • 결과가 없거나 하나 이상인 경우 예외 발생
        • 결과 X
          • javax.persistence.NoResultException
        • 하나 이상인 경우
          • javax.persistence.NonUniqueResultException
      • 하나 이상일 수 있는 경우 예외처리를 해야합니다.


Uploaded by N2T

'자바 > JPA' 카테고리의 다른 글

[JPA] 객체지향 쿼리  (0) 2023.11.09
[JPA] JPQL 소개  (0) 2023.11.09
[JPA] JPQL 파라미터 바인딩  (0) 2023.11.09
[JPA] 프로젝션  (0) 2023.11.09
[JPA] 페이징 API  (0) 2023.11.09