객체지향 쿼리 언어2 - JPQL

01. JPQL

Java Persistence Query Language

  • JPQL은 객체지향 쿼리 언어이다. 따라서 테이블을 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다.
  • JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.
  • JPQL은 결국 SQL로 변환된다.

02. JPQL 문법

  • select m from Member as m where m.age > 18
  • 엔티티와 속성은 대소문자 구분O (Member, age)
  • JPQL 키워드는 대소문자 구분X (SELECT, FROM, where)
  • 엔티티 이름 사용, 테이블 이름 아님 (Member)
  • 별칭은 필수 (m) (as는 생략 가능)

03. 리턴 타입

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 query3 = em.createQuery("select m.username m.age from Member m");  // 타입명시 X

04. 결과 조회 API

  • query.getResultList() : 결과가 하나 이상일 때, 리스트 반환
    • 결과가 없으면 빈 리스트 반환
  • query.getSingleResult() : 결과가 정확히 하나, 단일 객체 반환
    • 결과가 없으면 : javax.persistence.NoResultException
    • 둘 이상이면 : javax.persistence.NonUniqueResultException

Django에서 User.objects.filter(), User.objects.get() 이랑 비슷한 느낌인데?

05. 파라미터 바인딩

Where 조건절에 동적으로 파라미터 바인딩

TypedQuery<Member> query = em.createQuery("select m from Member m where m.username = :username", Member.class);

query.setParameter("username", "member1");
Member singleResult = query.getSingleResult();


// 메서드 체이닝
Member result = em.createQuery("select m from Member m where m.username = :username", Member.class)
  .setParameter("username", "member1")
  .getSingleResult();


댓글남기기