스프링데이터 + JPA/QueryDSL

19. 상수, 문자 더하기

sdafdq 2023. 11. 30. 12:23

상수

@Test
public void constant(){
    List<Tuple> result = query.select(m.username, Expressions.constant("A"))
            .from(m)
            .fetch();

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

Expressions 라는 게 있다.

QueryDSL껀데, QueryDSL용 표현식? 으로 바꿔주는 그런 것 같다. 그냥 기타 등등을 저기에 넣어둔 게 아닐까?

여튼

Expressions.constant() 하면 이름 그대로 상수를 넣을 수 있다.

그러면 JPQL에서 상수로 바뀌어 지는 모양이다.

 

tuple = [member1, A]
tuple = [member2, A]
tuple = [member3, A]
tuple = [member4, A]

 

제대로 나온다.

 

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

근데, JPQL에서는 나가지 않는다.

애플리케이션에서만 처리하는 용도인 것 같다.

하긴. 상수니 굳이 DB에 줄 필요도 없고, 상수를 요청한 애플리케이션에서만 알면 된다.

 

이거는 때때로 쓸 일이 있을 것 같다. 

어차피 DB에 가는 것도 아니고 그냥 조회해 오는 것에 덧붙여주는 용도 정도로 생각하면 될 듯 하다.

 

@Test
public void concat(){
    List<String> result = query.select(m.username.concat("_").concat(m.age.stringValue()))
            .from(m).where(m.username.eq("member1"))
            .fetch();

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

문자열 더하기다.

별칭의 값에 concat이라는 메소드를 지원해 준다. 당연히 QueryDSL꺼다.

보면 별칭의 값에 stringValue()라는 것을 하는데,

이거는 String 이외의 값을 String 타입으로 바꿔주는 것이다.

toString()은 저 별칭의 필드를 해설해주는, 

s = member1_member1.age

이런 식으로 나온다.

 

저 stringValue()가 제대로 저 엔티티의 필드의 값을 String형태로 바꿔주는 것이다.

저건 Enum쓸 때 많이 쓰겠다. 

 

s = member1_10

결과 의도한 대로 나왔고,

 

/* select
    concat(concat(member1.username, ?1), str(member1.age)) 
from
    Member member1 
where
    member1.username = ?2 */ select
        ((m1_0.username||?)||cast(m1_0.age as varchar)) 
    from
        member m1_0 
    where
        m1_0.username=?

나가는 SQL보면

m.age as varchar로 해서 나가는 걸 볼 수 있다.

stringValue()의 영향이다.

SQL에서 ||는 문자열을 합쳐주는 역할이다.

그러니까 즉,

m.username과 ? 는 우리가 넣은 _, cast(m.age as varchar) 해서 m.age를 varchar형식으로 바꿔주고,

또 그 것들을 ||해서 문자열로 이어준다.

 

 

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

21. 프로젝션 Dto  (0) 2023.12.01
20. 프로젝션  (0) 2023.11.30
18. CASE 문  (0) 2023.11.30
17. 서브 쿼리  (0) 2023.11.30
16. join fetch  (0) 2023.11.29