BE전문가 프로젝트

JPQL(Java Persistence Query Language) 본문

JPA

JPQL(Java Persistence Query Language)

원호보고서 2022. 11. 6. 20:30

JPQL소개

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

 

JPQL 문법

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

 

집합과 정렬

  • COUNT, SUM, AVG, MAX, MIN 전부 사용 가능
  • Group By, Having
  • Order By

 

TypeQuery, Query

  • TypeQuery - 반환 타입이 명확할 때 사용
  • Query - 반환 타입이 명확하지 않을 때 사용
TypedQuery<Member> query = em.createQuery("select m from Member m", Member.class);
Query query1 = em.createQuery("select m.age, m.username from Member m");

age와 username은 int와 String 임으로 반환 타입이 명확하지 않기 때문에 Query 사용 

 

결과 조회 API

  • query.getResultList(): 결과가 하나 이상일 때, 리스트 반환                                                                                                                                 결과가 없으면 빈 리스트 반환
  • Query.getStringResult(): 결과가 정확히 하나, 단일 객체 반환                                                                                                                                  결과가 없으면: javax.persistance.NoResultException                                                                                                      둘 이상이면: javax.persistance.NonUniqueResultException         
TypedQuery<Member> query = em.createQuery("select m from Member m", Member.class);

//둘 이상일 때
List<Member> resultList = query.getResultList();
//하나일 때
Member result = query.getSingleResult();

 

파라미터 바인딩 - 이름 기준, 위치 기준

//이름 기준
TypedQuery<Member> query = em.createQuery("select m from Member m where m.username =:username", Member.class);
query.setParameter("username", "member1");

Member result = query.getSingleResult();

//순서 기준
Member result = em.createQuery("select m from Member m where m.username = ?1", Member.class)
                    .setParameter(1, "member")
                    .getSingleResult();

'JPA' 카테고리의 다른 글

페이징 API  (0) 2022.11.06
프로젝션  (0) 2022.11.06
객체지향 쿼리 언어  (0) 2022.11.06
값 타입 컬렉션  (0) 2022.11.02
값 타입의 비교  (0) 2022.11.02
Comments