스프링데이터 + JPA/QueryDSL

10. 결과 조회

sdafdq 2023. 11. 28. 12:20

지금까지 fetchOne()해서 단건 조회만 함

 

fetch() // 리스트 조회, 데이터 없으면 빈 리스트 반환
fetchOne() // 단건 조회, 데이터 없으면 null, 결과가 둘 이상이면 Exception
fetchFirst() // limit(1).fetchOne(), 즉 처음 페이지의 맨처음 데이터 단건만 조회
fetchResults() // 페이징 정보 포함, total count 쿼리 추가 실행. 즉 페이징하고 페이징 데이터 포함 객체 가져오기 용
fetchCount() // count 쿼리 날려서 count만 조회.

 

 

일단은 fetch(), fechOne(), fetchFirst()

List<Member> fetch = query.selectFrom(m).fetch();

Member fetchOne = query.selectFrom(m).where(m.username.eq("member1")).fetchOne();

Member fetchFirst = query.selectFrom(m).fetchFirst();

 

//fetch
/* select
    member1 
from
    Member member1 */ select
        m1_0.member_id,
        m1_0.age,
        m1_0.team_id,
        m1_0.username 
    from
        member m1_0
        


//fetchOne
/* select
    member1 
from
    Member member1 
where
    member1.username = ?1 */ select
        m1_0.member_id,
        m1_0.age,
        m1_0.team_id,
        m1_0.username 
    from
        member m1_0 
    where
        m1_0.username=?
        
        
        
//fetchFirst
/* select
    member1 
from
    Member member1 */ select
        m1_0.member_id,
        m1_0.age,
        m1_0.team_id,
        m1_0.username 
    from
        member m1_0 
    fetch
        first ? rows only

다 생각했던 데로 들어간다.

 

 

그 다음 fetchResult()

QueryResults<Member> result = query.selectFrom(m).fetchResults();

앞서 fetchResult()는 페이징 객체로 감싸서 가져온다고 했다. count, 현재 페이지 번째 등의 페이징에 관한 정보를 가지고 있는 객체로 DB의 데이터들을 감싸서 가져온다.

 

그래서 

 

/* select
    count(member1) 
from
    Member member1 */ select
        count(m1_0.member_id) 
    from
        member m1_0
        
        

/* select
    member1 
from
    Member member1 */ select
        m1_0.member_id,
        m1_0.age,
        m1_0.team_id,
        m1_0.username 
    from
        member m1_0

이렇게 쿼리가 2번 나간다.

 

카운트 쿼리랑, 데이터 가져오는 쿼리.

 

 

아예 카운트만 가져오는 쿼리메소드도 있다.(편의 상 이제 QueryDSL의 쿼리 관련 메소드들을 쿼리메소드라고 부름)

 

long total = query.selectFrom(m).fetchCount();
/* select
    count(member1) 
from
    Member member1 */ select
        count(m1_0.member_id) 
    from
        member m1_0

 

참고로 근데, 이거 fetchResults() 와 fetchCount()가 deprecated되었다. 

 

강의에서도 경고하는데, 쿼리가 복잡해지면 total count가 다를 수 있다 그러는데,

그러니까 그냥 다른 것들이랑 left join등을 해서 가져올 경우 데이터가 뻥튀기 되거나 그럴 수도 있다는 거다.

 

이거는 Spring Data JPA에서 배울때도 페이징 할 때 카운트 쿼리는 join해서 가져올 경우 따로 만들 수도 있다는 걸 이야기 했다

https://qwefdg3.tistory.com/881

끝에서 약간 위쪽

 

이제 QueryDSL이 권장하는 것은 fetchResults()와 fetchCount()를 쓰지 말고,

그냥 fetch()로 가져오고 fetch().size()로 알으라는 거다.

 

나중에 따로 페이징에 대해 더 배울 것이다.

 

 

'스프링데이터 + JPA > QueryDSL' 카테고리의 다른 글

12. 페이징  (0) 2023.11.28
11. 정렬  (0) 2023.11.28
9. 검색 조건 쿼리  (0) 2023.11.28
8. Q타입  (0) 2023.11.28
7. JPQL vs QueryDSL  (0) 2023.11.28