JAVA/JPA

(JPA) JPQL

ri5 2021. 7. 8. 11:57

JPQL 이란


• JPQL은 객체지향 쿼리 언어다.따라서 테이블을 대상으로 쿼리 하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다.

• JPQL은 SQL을 추상화해서 특정데이터베이스 SQL에 의존하 지 않는다.

• JPQL은 결국 SQL로 변환된다.

 

JPQL 문법


• select m from Member m where m.age > 18

• 엔티티와 속성은 대소문자 구분O (Member, age)

• JPQL 키워드는 대소문자 구분X (SELECT, FROM, where)

• 엔티티 이름 사용, 테이블 이름이 아님(Member)

• 별칭은 필수(m) (as는 생략가능)

 

집합과 정렬

• GROUP BY, HAVING

• ORDER BY

select
   COUNT(m), //회원수
   SUM(m.age), //나이 합
   AVG(m.age), //평균 나이
   MAX(m.age), //최대 나이
   MIN(m.age) //최소 나이
from Member m

 

TypeQuery, Query

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

TypedQuery<Member> query = em.createQuery("SELECT m FROM Member m", Member.class);
TypedQuery<String> query = em.createQuery("SELECT m.userName FROM Member m", String.class);

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

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

 

결과 조회 API

1) query.getResultList(): 결과가 하나 이상일 때, 리스트 반환

   • 결과가 없으면 빈 리스트 반환

2) query.getSingleResult(): 결과가 정확히 하나, 단일 객체 반환

  • 결과가 없으면: javax.persistence.NoResultException 

  • 둘 이상이면: javax.persistence.NonUniqueResultException

 

파라미터 바인딩

1) 이름 기준

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

query.setParameter("username", usernameParam);

2) 위치 기준

※ 중간에 한개라도 추가되면 전부 밀리므로 이름 기분을 사용

TypedQuery<Member> query = em.createQuery(
                            "SELECT m FROM Member m where m.username=?1",
                             Member.class);

query.setParameter(1, usernameParam);