JPQL(Java Persistence Query Language)
기본 문법과 기능
JPQL은 엔티티 객체를 대상으로 쿼리한다.
JPQL은 SQL로 변환된다.
select m from Member as m wehere m.age > 18
기본적인 문법은 SQL과 거의 동일하다.
유의할 점
- 엔티티와 속성은 대소문자를 구분한다.
- 테이블 이름이 아닌 엔티티 이름을 사용한다.
- 별칭이 필수이다.
TypeQuery: 반환 타입이 명확할 때
Query: 반환 타입이 명확하지 않을 때
TypedQuery<Member> query = em.createQuery("select m from Member m", Member.class);
TypedQuery<String> query1 = em.createQuery("select m.username from Member m", String.class);
Query query2 = em.createQuery("select m.username, m.age from Member m");
createQuery의 두번째 인자로 타입을 줄 수 있다.
위 코드에서 query, query1은 반환타입이 명확하지만 query2의 경우에는 username과 age를 가져와야하니 타입을 정할 수 없다.
결과 조회
TypedQuery<Member> query = em.createQuery("select m from Member m", Member.class);
List<Member> resultList = query.getResultList();
Member singleResult = query.getSingleResult();
- getResultList()
- getSingleResult()
query.getResultList()메소드를 이용하면 컬렉션을 반환받을 수 있다. 결과가 없으면 빈 리스트를 반환한다.
query.getSingleResult()메소드를 이용하면 하나의 결과를 반환받을 수 있다. 그런데, 결과가 없거나 결과가 2개 이상인 경우 예외가 발생하니 주의해야한다.
파라미터 지정
TypedQuery<Member> query = em.createQuery("select m from Member m where m.username = :username", Member.class);
query.setParameter("username","member1");
쿼리에 :파라미터명을 적어주고 setParameter로 파라미터 값을 지정하면 된다.
프로젝션
SELECT절에 조회할 대상을 지정하는것
프로젝션 대상: 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 데이터 타입)
SELECT m FROM Member m -> 엔티티 프로젝션
SELECT m.team FROM Member m -> 엔티티 프로젝션(결과가 team엔티티. 내부적으로 team을 join함.)
SELECT m.address FROM Member m ->임베디드 타입 프로젝션
SELECT m.username, m.age FROM Member m -> 스칼라 타입 프로젝션
이렇게 조회한 결과는 모두 영속성 컨텍스트에 들어가기때문에 변경이 발생하면 커밋시에 자동으로 변경내용이 저장된다.
List<MemberDTO> result = em.createQuery("select new ..(패키지명을 포함).MemberDTO(m.username,m.age) from Member m",MemberDTO.Class).getResultList();
여러 값을 가져올 때는, DTO클래스를 만들어서 받는것이 깔끔하다.
이때 select절에는 new {패키지명을 포함한 클래스명}({속성1},{속성2}) 처럼 작성해야한다.
(DTO에 생성자가 있어야 한다.)
페이징
JPA는 페이징을 다음 두 API로 추상화한다.
- setFirstResult(int startPosition): 조회 시작 위치
- setMaxResults(int maxResult): 조회할 데이터 수
List<Member> resultList = em.createQuery("select m from Member m order by m.age desc", Member.class)
.setFirstResult(0)
.setMaxResults(10)
.getResultList();
위 예시를 실행하고, 결과를 출력해보면..
이렇게 age 내림차순으로 정렬된 순서에서 0번째부터 10개의 member가 조회된 것을 볼 수 있다.
'웹개발 > JPA' 카테고리의 다른 글
JPA가 지원하는 다양한 쿼리 방법 (0) | 2023.07.22 |
---|---|
값 타입 (0) | 2023.07.19 |
영속성 전이 CASCADE (0) | 2023.07.19 |
즉시 로딩과 지연 로딩 (0) | 2023.07.16 |
프록시 (0) | 2023.07.14 |
댓글