🖊 JPQL 문법
select m from Member m where m.age > 26
- Entity와 속성은 대소문자 구분해서 작성해야한다.
- JPQL 키워드는 대소문자를 구분하지 않는다(SELECT, FROM, WHERE)
- 별칭이 필수(m)
TypeQuery, Query
TypedQuery<Member> query =
em.createQuery("select m from Member m where m.age > 26", Member.class);
Query query =
em.createQuery("select m .age, m.username from Member m where m.age > 26");
- TypeQuery는 반환 타입이 명확할 때 사용한다
- Query는 반환 타입이 명확하지 않을 때 사용한다.
결과 조회 API
TypedQuery<Member> query =
em.createQuery("select m from Member m where m.age > 26", Member.class);
List<Member> members = query.getResultList();
- getResultList는 결과가 없으면 빈 리스트를 반환한다.
TypedQuery<Member> query =
em.createQuery("select m from Member m where m.id = 1", Member.class);
Member member = query.getSingleResult();
- getSingleResult는 결과가 정확히 하나가 반환되지 않으면 Exception 오류가 발생한다.
- Spring data jpa같은 경우에는 추상화 해서 메소드가 제공되어 결과가 없으면 null이 반환된다.
파라미터 바인딩
int userAge = 100;
TypedQuery<Member> query =
em.createQuery("select m from Member m where m.age > :age", Member.class)
.setParameter("age", userAge);
List<Member> members = query.getResultList();
NamedQuery
Entity
@NamedQuery(
name = "Member.findByUsername",
query = select m from Member m where m.username = :username")
public class Member {
...
}
- 어플리케이션 로딩 시점에 쿼리 실수를 잡을 수 있다.
- SpringBoot에선 @Query를 네임드쿼리에 등록해준다.