JPA는 복잡한 검색 조건을 사용해서 엔티티 객체를 조회할 수 있는 다양한 쿼리 기술을 지원한다.
이번 글에서는 다양한 객체지향 쿼리 중 JPQL에 대해 다뤄볼 것이다!
(Java Persistence Query Language)
기본적인 문법은 SQL과 유사하다!
📌 JPQL은 엔티티 객체를 대상으로 쿼리를 질의하고, SQL은 데이터베이스 테이블을 대상으로 쿼리를 질의한다.
select_문 :: =
select_절
from_절
[where_절]
[groupby_절]
[having_절]
[orderby_절]
update_문 :: = update_절 [where_절]
delete_문 :: = delete_절 [where_절]
from
절에 들어가는 것은 객체이다select m from Member m where m.age > 8
Member
엔티티와 username
필드SELECT, FROM, where
Member
AS
는 생략 가능하다)Member
의 별칭 m
JPQL 실행할 시 쿼리 객체 생성이 필요하다.
TypedQuery<Member> query =
em.createQuery("SELECT m FROM Member m", Member.class); // 반환이 명확
List<Member> resultList = query.getResultList();
for (Member member : resultList) {
System.out.println("member = " + member);
}
또는 여러 엔티티나 컬럼을 선택할 경우(반환 타입이 명확하지 않을 경우) 사용한다.
Query query =
em.createQuery("SELECT m.username, m.age FROM Member m");
List resultList = query.getResultList();
for (Object o : resultList) {
Object[] result = (Object[]) o; // 결과가 둘 이상일 경우 Object[]
System.out.println("username = " + result[0]);
System.out.println("age = " + result[1]);
}
javax.persistence.NoResultException
예외 발생javax.persistence.NonUniqueResultException
예외 발생String usernameParam = "User1";
TypedQuery<Member> query =
em.createQuery("SELECT m FROM Member m where m.username = :username", Member.class); // 파라미터 정의
query.setParameter("username", usernameParam); // 파라미터 바인딩
List<Member> resultList = query.getResultList();
// 아래와 같이 작성 가능(메소드 체인)
List<Member> members =
em.createQuery("SELECT m FROM Member m where m.username = :username", Member.class)
.setParameter("username", usernameParam)
.getResultList();
:
사용List<Member> member =
em.createQuery("SELECT m FROM Member m where m.username = ?1", Member.class)
.setParameter(1, usernameParam)
.getResultList();
?
다음에 위치 값을 지정📌 참고 자료