스프링데이터 + JPA/QueryDSL

20. 프로젝션

sdafdq 2023. 11. 30. 13:15

프로젝션이란

 

select에 무얼 가지고 올지 대상을 지정하는 것.

 

보통 이제 세가지 경우로 나뉘는데,

단일 프로젝션

복수의 프로젝션

Dto 조회 (이것도 사실 상 DB상에서 복수의 프로젝션 범주) 이정도

 

단일 조회는 엔티티 자체를 조회해오거나, 아니면 m.username해서 하나만 조회해 올 때.

@Test
public void simpleProjection(){
    List<String> result = query.select(m.username).from(m).fetch();

    for (String s : result) {
        System.out.println("s = " + s);
    }
}

그냥 조회해 오는거다.

select 절 안에 조회해올것의 표현식을 쓰고, 가져오면 된다.

Q클래스는 엔티티의 정보를 담은 표현식들의 모음이라고 생각하면 된다.

 

/* select
    member1.username 
from
    Member member1 */ select
        m1_0.username 
    from
        member m1_0

 

s = member1
s = member2
s = member3
s = member4

 

 

다음은 튜플

@Test
public void tupleProjection(){
    List<Tuple> result = query.select(m.username, m.age).from(m)
            .fetch();

    for (Tuple tuple : result) {
        System.out.println("tuple = " + tuple);
    }

}

저렇게 여러 개의 열을 프로젝션 하면 튜플이라는 자료구조에 담아서 준다.

근데 저 Tuple은, QueryDSL이 제공해주는 튜플이다.

즉, QueryDSL에 종속적인 튜플이다.

 

특정 기술에 종속적인 자료형, 객체를 서비스나 컨트롤러로 넘기는 것은 거부하고 싶다.

튜플로 가져왔어도, 애플리케이션에서 Dto로 변환하여 넘겨주자.

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

 

tuple = [member1, 10]
tuple = [member2, 20]
tuple = [member3, 30]
tuple = [member4, 40]

 

 

Dto조회는 다음장에서 할 것이다.

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

22. @QueryProjection  (0) 2023.12.01
21. 프로젝션 Dto  (0) 2023.12.01
19. 상수, 문자 더하기  (0) 2023.11.30
18. CASE 문  (0) 2023.11.30
17. 서브 쿼리  (0) 2023.11.30