먹었으면 뇌를 쓰자

Query dsl - Querying, Join, Paging 구현하기 (+query dsl 5.0.0 fetchResult count 쿼리 작성) 본문

Framework/JPA

Query dsl - Querying, Join, Paging 구현하기 (+query dsl 5.0.0 fetchResult count 쿼리 작성)

뇌이비 2022. 11. 29. 14:27

 

상황: Person.class와 Address.class가 @OneToMany 양방향 연관관계 설정되어 있다.

Person.class는 'addresses'를 통해 Address.class의 데이터를 담아온다.

 

 

 

 

 

 

Querying(Select)

 

query dsl 작성

 

 

- JPAQueryFactory는 EntityManager를 통해 JPQL 쿼리를 날린다.

- Q타입 클래스 파일을 선언해야 한다.

- 해당 쿼리는 이름에 'k'가 포함되면서 22살 이상인 필드를 리스트로 반환한다.

- 출력은 forEach문을 이용해 이름을 출력하도록 한다. 

 

 

결과 반환

 

fetch : 여러 개의 결과를 리스트로 반환

fetchOne : 하나의 결과를 지정한 타입으로 반환

fetchFirst : 여러 개의 결과 중 가장 처음 결과만 반환

fetchCount : 결과의 값이 아닌 개수를 long 타입으로 반환 

fetchResults : 결과의 값과 개수를 QueryResults 타입으로 반환 

 

 

 

run 실행결과

 

 

 

Join(fetch join)

 

query dsl 작성

 

 

- JPAQueryFactory는 EntityManager를 통해 JPQL 쿼리를 날린다.

- Q타입 클래스 파일을 선언해야 한다. 조인될 클래스도 함께 선언한다.

- .innerjoin(클래스1.매핑변수, 클래스 2) 처리를 해준다.

- 성능 개선을 위해 select문을 한 번만 날리도록 하려면 뒤에 .fetchjoin을 붙여주면 된다. 

 

- 출력은 Soutv를 이용해 city 변수를 출력하도록 한다.

(반환 결과 persons.첫번째 필드 읽기 get(0).매핑변수 읽기 getAddresses().첫번째 필드 읽기.get(0),변수 읽기getCity())

 

 

 

run 실행결과

 

 

 

Paging

 

 

query dsl 작성

 

 

- 기억장치의 분산 할당 기법 중 페이징(Paging)을 하기 위해 결과의 개수를 받는다.

- QueryResults 타입으로, fetchResults 메소드를 통해 값과 개수를 함께 받는다.

- 결과는 나이 오름차순으로 정렬한다.

- offset으로 시작 인덱스, limit로 결과 조회 개수를 지정한다. (첫번째 값부터 시작, 두 개를 조회한다)

- 개수는 long 타입으로, count 변수를 만들어 getTotal 메소드를 통해 받는다. 

- 값은  getResult 메소드를 통해 받는다.

 

- 개수 출력은 Soutv를 이용해 count 변수를 출력하도록 한다.

- 값 출력은 forEach문을 이용해 이름을 출력하도록 한다. 

 

 

 

run 실행결과

 

 

person 객체의 필드 4개가 count 변수에 잘 체크되었다.

필드 2개를 나이 오름차순으로, 이름을 출력하기로 했었는데

가장 나이가 어린 15살 hong, 그 다음으로 어린 20살 kim이 잘 출력되었다.

 

 

 

 

fetchResults 대신 fetch 메소드로 값과 개수 받는 법

 

결과 반환 중 fetchCount 메소드, fetchResults 메소드는

내가 작성한 쿼리를 기반으로 count 쿼리를 자체적으로 만들어 실행한다.

 

복잡한 쿼리에서는 자체 생성이 어려워지므로

query dsl 5.0.0 버전부터는 두 메소드가 중단되었다.

 

따라서 count 쿼리를 따로 작성해야 한다.

 

 

query dsl 작성

 

 

(기존) QueryResults 타입으로, fetchResults 메소드를 통해 값과 개수를 함께 받는다. (값과 개수)

-> (query dsl 5.0.0) List 타입으로, fetch 메소드를 통해 값을 받는다. (값)

 

(기존) fetchResult 변수를 만들어 getResults 메소드, count 변수를 만들어 getTotal 메소드를 사용해 

각각 값과 개수를 반환받는다. (값과 개수)

-> (query dsl 5.0.0) int 타입으로, count 쿼리를 만들어준다. 개수를 반환하기 위해 size 메소드를 사용한다. (개수)

 

 

 

정리해보면 fetchResults 메소드를 사용할 때는 값과 개수를 QueryResults 타입으로 반환받았다.

출력을 위해 변수들을 설정해 getResults 메소드로 값을, getTotal 메소드로 개수를 받아 출력하였다. 

 

 

이제는 기본 fetch 메소드를 사용해서 값을, count 쿼리를 만들고 size 메소드를 사용해서 개수를 반환받으면 된다.

출력할 때는 이미 값이 반환된 fetch 메소드를 재활용하면 되고, size 메소드로 받은 개수를 출력하면 된다.  

 

 

 

 

run 실행결과

 

 

 

count 쿼리를 사용해도 fetchResults와 동일한 결과가 잘 출력되었다.

 

 

 

 

 

Comments