-
[Spring] Querydsl select null 처리Framework/Spring 2023. 3. 17. 21:00
스프링에서 querydsl(5.0.0 기준)을 사용하다보면 테이블에 있는 값이 아닌 테이블의 특정 값으로 projection해야 될 때가 있다.
select절만 예시로 보면
select(new QDto(user, info)).from(user).leftJoin(info)...
이렇게 되어 있다고 할 때 공통의 querydsl을 사용해야 할 때 info 부분만 null로 사용할 때 다음과 같은 에러를 볼 수 있다.
아래의 예시처럼 한 개의 쿼리로 동일한 dto로 사용할 때이다.
1. select(new QDto(user, info)).from(user).leftJoin(info)...
2. select(new QDto(user, null)).from(user).leftJoin(info)...
리턴값에 null을 명시할 경우 컴파일 에러를 발생하지 않고 런타임으로 뜬다..
select(new QDto(user, Expressions.constant(null))).from(user).leftJoin(info)... select(new QDto(user, Expressions.nullExpression())).from(user).leftJoin(info)...
누가봐도 null처리 할 수 있는 것처럼 보이기 때문에 이렇게 하면 될 줄 알았다. 하지만 안된다!!
결과적으로 해결방법은 QDto부분에 매개변수가 다른 @QueryProjection을 넣으면 된다.
public class Dto{ ... @QueryProjection public Dto(User user, Info info){ ... } @QueryProjection public Dto(User user){ ... } }
이 경우에는 공통의 querydsl에서 dto도 같이 사용하기 때문에 발생하였는데 이런 경우는 특수한 경우이다. 결과적으로 볼 때 querydsl에서 select 절에 null은 넣을 수 없다.
'Framework > Spring' 카테고리의 다른 글
[Spring] Java 8 LocalDateTime 직렬화/역직렬화 오류 해결 (0) 2023.05.30 [Spring] Test 코드에서 @Slf4j 사용하기 (0) 2022.05.03 [Spring] Domain time mapping (0) 2022.04.25 [Spring] request에서 enum으로 값 전달받기 (0) 2022.03.15 [Spring] Querydsl 동적 쿼리 (0) 2022.03.04