•
JPQL은 객체지향 쿼리 언어로 테이블을 대상으로 쿼리하지 않으며 엔티티 객체를 대상으로 쿼리한다.
•
JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.
•
JPQL은 결국 SQL로 변환된다.
1. 기본 문법과 쿼리 API
•
SELECT, UPDATE, DELETE 문을 사용할 수 있으며 저장의 경우 persist() 메소드를 사용하므로 INSERT는 없다. 전체 구조는 SQL과 유사하다.
SELECT 문
SELECT m FROM Member AS m where m.username = 'Hello'
SQL
복사
•
대소문자 구분
◦
엔티티와 속성은 대소문자를 구분한다. 다만 SELECT, FROM 같은 JPQL 키워드는 대소문자를 구분하지 않는다.
•
엔티티 이름
◦
JPQL에서 사용한 Member는 클래스 명이 아닌 엔티티 명이다. 엔티티 명을 지정하지 않으면 클래스 명을 기본값으로 사용한다.
•
별칭은 필수
◦
JPQL은 별칭을 필수로 사용해야 한다.
TypeQuery, Query
•
작성한 JPQL을 실행하려면 쿼리 객체를 만들어야 하는데, 쿼리 객체에는 TypeQuery와 Query가 있다.
•
반환할 타입을 명확하게 지정할 수 있으면 TypeQuery, 없으면 Query 객체를 사용하면 된다.
TypedQuery<Member> query = em.createQuery("SELECT m FROM Member m", Member.class);
Query query = em.createQuery("SELECT m FROM Member m");
Java
복사
결과 조회
•
다음 메소드들을 호출하면 실제 쿼리를 실행해서 데이터베이스를 조회한다.
◦
query.getResultList()
▪
결과를 예제로 반환한다. 결과가 없다면 빈 컬렉션을 반환한다.
◦
query.getSingleResult()
▪
결과가 정확히 하나일 때 사용한다.
▪
결과가 없으면 javax.persistence.NoResultException 예외가 발생한다.
▪
결과가 1개보다 많으면 javax.persistence.NonUniqueResultException 예외가 발생한다.
2. 파라미터 바인딩
•
JDBC는 위치 기준 파라미터 바인딩만 지원하지만 JPQL은 이름 기준 파라미터 바인딩도 지원한다.
•
이름 기준 파라미터는 파라미터를 이름으로 구분하는 방법으로 앞에 :를 사용한다.
TypedQuery<Member> query = em.createQuery("SELECT m FROM Member m where m.username = :username", Member.class);
Java
복사
•
위치 기준 파라미터는 ? 다음에 위치 값을 주면 된다.
List<Member> members = em.createQuery("SELECT m FROM Member m whre m.username = ?1", Member.class).setParameter(1, usernameParam).getResultList();
Java
복사
•
위치 기준 파라미터 방식 대신 이름 기준 파라미터 바인딩 방식을 사용하는 것이 더 명확하다.