JPA에서 다양한 쿼리 방법을 지원하는 데 한계가 있고, 특히 검색쿼리 (select)를 실행할 때 복잡한 쿼리문을 가지므로 좀 더 직관적으로 이해하기 쉬운 Query 개념을 소개해본다.
JPA를 사용하면, 엔티티 객체를 중심으로 개발할 수 있는데, 검색 쿼리의 경우에도, 테이블이 아닌 엔티티 객체를 대상으로 검색하기 위해서 JPQL을 사용한다.
🧨 JPQL 사용시, 주의할 사항
JPQL 키워드는 대소문자를 구분하지 않지만, 엔티티와 속성은 대소문자를 구분하기 때문에 사용시 주의할 것!- 테이블 이름 대신 엔티티 이름을 사용한다.
-@Entity(name="...")으로 설정 가능 엔티티명 설정 가능하지만, 기본 값을 이름으로 사용하길 추천한다.- JPQL의 경우는 별칭은 필수적이다. (AS는 생략 가능하다.)
select m from Member as m where m.age > 18TypeQuery<Member> query = em.createQuery("select m from Member m", "Member.class");Query query = em.createQuery("select m.username, m.age from Member m");NullPointerException에 대한 걱정은 하지 않아도 된다.NoResultException를 발생시키고, 둘 이상이면, NonUniqueResultException를 발생시킨다.select m from Member m where m.username = :username
query.setParameter("username",usernameParam);
select m from Member m where m.username = ?1
query.setParameter(1, usernameParam);
select m from Member m
select m.address from Member m
select m.username, m.age from Member m
페이징 API
JPA는 페이징을 다음 두 API로 추상화할 수 있다.
(몇 번째)부터 (몇 개) 가지고 올래?1) setFirstResult(int startPosition);
: (0부터 시작하는) 조회 시작 위치
2) setMaxResults(int maxResult);
: 조회할 데이터 수
select m from Member m inner join m.team tselect t from Member m left outer join m.team tselect m from Member m where m.age > (select avg(m2.age) from Member m2)