상수
@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 |