728x90
Cannot invoke "com.querydsl.core.types.Expressions.accept(com.querydsl.core.types.Visitor, Object)" because "arg" is null
Querydsl에서 @QueryProjection을 사용해 DTO를 조회하는 과정에서 발생한 예외이다.
원인
Querydsl에서 DTO를 @QueryProjection으로 조회할 때, select 절에 일부 필드를 null로 반환하고자 직접 null을 명시하면 아래와 같은 예외가 발생할 수 있다.
예외가 발생한 코드는 아래와 같다.
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.Projections;
QMember member = QMember.member;
List<MemberDto> results = queryFactory.select(Projections.constructor(MemberDto.class,
member.id,
null, // 에러 원인
member.email))
.from(member)
.fetch();
해결 방법
null 대신 Querydsl에서 제공하는 Expressions.nullExpression(필드타입.class)을 사용해 null 값을 표현해야 한다. 타입을 명확히 지정해서 빈 값을 만들어주는 셈이다.
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.Projections;
QMember member = QMember.member;
List<MemberDto> results = queryFactory.select(Projections.constructor(MemberDto.class,
member.id,
Expressions.nullExpression(String.class), // null 대체
member.email))
.from(member)
.fetch();
728x90