Query 작성법 1-1. JPQL

Yennie·2024년 5월 11일

JPA

목록 보기
9/19

JPQL

Java Persistence Query Language
엔티티 객체를 조회하는 객체지향 쿼리

@Query("select m from Member as m where m.name = 'yeeun'")
List <Item> findItem();

기본문법

  • 엔티티와 속성은 대소문자를 구분함
  • 엔티티 이름인 Member, 그리고 Member 속성 name은 대소문자를 구분해주어야함
  • select, from, as 같은 키워드는 구분하지 않아도 됨
  • @Entity의 name을 지정하지 않으면, Member는 클래스 이름이 아닌 엔티티 이름
  • 엔티티의 별칭은 필수적으로 명시해야함 (as 키워드)

TypedQuery vs. Query

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

  • 두번째 파라미터에 타입정보 작성
TypedQuery<Member> query1 = em.createQuery("select m from Member m", Member.class);
TypedQuery<String> query2 = em.createQuery("select m.username from Member m", String.class);

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

  • String과 int를 함께 조회 시
Query query3 = em.createQuery("select m.username, m.age from Member m");

API

  • getResultList()
    결과가 하나 이상일 때 리스트 반환, 없는 경우 빈 리스트
List<Member> resultList = query1.getResultList();
  • getSingleResult()
    결과가 단 하나일 경우 사용, 단일 객체를 반환
    결과가 없으면 NoResultException, 둘 이상이면 NonUniqueResultException 발생
Member singleResult = query2.getSingleResult();

파라미터 바인딩

  • 이름기준
Member result = em.createQuery("select m from Member m where m.username = :username", Member.class)
                .setParameter("username","member1")
                .getSingleResult();
Member singleResult = query.getSingleResult();
  • 위치기준
Member result = em.createQuery("select m from Member m where m.username = ?1", Member.class)
                .setParameter(1, "member1")
                .getSingleResult();

-> 사용하지 않는 게 좋음. 데이터베이스에는 값이 계속해서 추가되기 때문에 위치가 변경될 가능성이 매우 높기 때문

장점

  • 객체를 대상으로 하는 쿼리문이며, SQL을 추상화해서 사용하기 때문에 어떤 DB를 사용하더라도 문제 없이 사용할 수 있음
  • SQL과 비슷한 문법을 가지며, JQPL -> SQL로 변환

단점

  • 직접 쿼리문을 문자열로 작성하기 때문에 오타로 인한 컴파일 에러를 통해 확인이 불가능
  • 동적인 쿼리 (if - else)등의 쿼리 언어를 작성하는데에는 효율적이지 못함

참고
https://ittrue.tistory.com/270

profile
PM | Aspiring SWE | linkedin.com/in/emilyyeeun

0개의 댓글