/////
Search
Duplicate
🧿

2. JPQL

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을 실행하려면 쿼리 객체를 만들어야 하는데, 쿼리 객체에는 TypeQueryQuery가 있다.
반환할 타입을 명확하게 지정할 수 있으면 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
복사
위치 기준 파라미터 방식 대신 이름 기준 파라미터 바인딩 방식을 사용하는 것이 더 명확하다.