JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공
즉, 테이블을 대상으로 쿼리를 하지 않고 엔티티 객체를 대상으로 쿼리함
SQL을 추상화했기 때문에 특정 데이터베이스 SQL에 의존하지 않는다는 장점 가짐
SQL 문법과 유사하며 SELECT, FROM, GROUP BY, HAVING, JOIN
등을 지원
JPQL 사용 예시
// 여기서 Member는 테이블 이름이 아닌 엔티티 이름
String jpql = "select m From Member m where m.name like '%hello$'"
List<Member> result = em.createQuery(jpql, Member.class).getResultList();
for(Member member : result) {
System.out.println("member: " + member);
}
JPQL 의 문제점
SQL문법과 유사한 문법을 구사
select _ from _ [where] _ [groupby] _ [having] _ [orderby] _
update _ [where] _
delete _ [where] _
JPQL 특징
Member, username
등)SELECT, FROM, WHERE
등)Member as m
) → as
키워드는 생략 가능집합, 정렬 등의 함수를 제공
SELECT
COUNT(m),
SUM(m.age),
AVG(m.age),
MAX(m.age),
MIN(m.age)
FROM Member m
TypedQuery
반환 타입이 명확할 때 사용
반환 타입이 명확할 경우 두 번째 파라미터로 타입 정보를 작성할 수 있음
기본적으로 엔티티 타입을 사용하지만 String 타입 정보도 사용 가능
코드 예시
TypedQuery<Memeber> query1 = em.createQuery("select m from Member m", Member.class);
TypedQuery<String> query2 = em.createQuery("select m.username from Member m", String.class);
Query
반환 타입이 명확하지 않을 때 사용
코드 예시
Query query3 = em.createQuery("select m.username, m.age from Member m");
getResultList()
결과가 하나 이상일 때 사용하며, 리스트로 반환됨
결과가 없을 경우 빈 리스트를 반환
코드 예시
TypedQuery<Membjer> query1 = em.createQuery("select m from Member m", Member.class);
List<Member> resultList = query1.getResultList();
for(Member m : resultList) {
System.out.println("m: " + m.getUsername());
}
getSingleResult()
결과가 단 하나일 경우 사용하며, 단일 객체를 반환
결과가 없을 경우 javax.persistencej.NoResultException
예외 발생하면 결과가 둘 이상일 경우 javax.persistence.NonUniqueResultException
예외 발생
spring data jpa 사용하는 경우 null
또는 Optional
타입으로 반환하여 처리
코드 예시
TypedQuery<Member> query2 = em.createQuery("select m from member m where m.id = 1L", Member.class);
Member singleResult = query2.getSingleResult();
System.out.println("singleResult: " + singleResult.getUsername());