inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! Querydsl

동적 쿼리 메서드 조합시 null 처리

305

블티

작성한 질문수 12

0

@Test
    public void dynamicQueryWhereParam() {
        String usernameParam = null;
        Integer ageParam = 10;

        List<Member> result = queryFactory
                .selectFrom(member)
//                .where(usernameEq(usernameParam), ageEq(ageParam))
                .where(allEq(usernameParam, ageParam))
                .fetch();

        assertThat(result.size()).isEqualTo(1);
    }

    private BooleanExpression usernameEq(String usernameParam) {
        if (usernameParam == null) {
            return Expressions.TRUE;
        }
        return member.username.eq(usernameParam);
    }

    private BooleanExpression ageEq(Integer ageParam) {
        if (ageParam == null) {
            return Expressions.TRUE;
        }
        return member.age.eq(ageParam);
    }

    private BooleanExpression allEq(String usernameParam, Integer ageParam) {
        return usernameEq(usernameParam).and(ageEq(ageParam));
    }
select m.* from member m where true and m.age = 10;

위와 같이 Expressions.TRUE를 반환하게 만들면 쿼리에 true가 포함돼서 실무에서 사용하기에는 좀 그럴까요?

java jpa 동적쿼리-where다중파라미터사용

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

동적 쿼리 메서드 조합시 null 처리에 대한 질문이시군요.

가장 좋은 방법은 where() 메서드를 호출하기 전에 파라미터들을 null check하는 것입니다. 하지만 이 방법이 불가능한 상황일 수도 있습니다.

Expressions.TRUE로 반환되는 쿼리는 실제로는 아무런 결과도 반환하지 않기 때문에, 쿼리에 true가 포함되는 것에 대한 걱정은 할 필요가 없습니다. 따라서 allEq() 메서드에서 usernameEq()와 ageEq()를 and()로 연결하고, 반환된 BooleanExpression이 알아서 null을 처리하게끔 할 수 있습니다.

하지만, 로직상으로는 조금 더 조심해서 쿼리를 작성하는 것이 더 좋습니다.

감사합니다.

SpringBoot 4.X에서의 Querydsl 설정

0

104

2

querydsl 오픈소스에 대한 질문

1

81

1

예제에서의 카운트 쿼리에서 join문과 where문은 필요없지 않나요?

0

112

1

Querydsl 6.X버전에 대해서 어떻게 생각하시나요?

0

325

2

여러 테이블 조인하여 통계치를 구하고자 할 때 어떤 방법이 더 효율적일까요

1

73

1

fetchResults()는 더이상 권장되지 않는다는데 맞나요?

0

164

1

querydsl sum() 메서드 없어요.

0

163

2

build 디렉터리 생성

0

142

2

자바 ORM 표준 JPA 프로그래밍 - 기본편 듣고 바로 학습해도 괜찮을까요?

0

116

2

현재 Querydsl에서 from절 서브쿼리를 지원하나요?

0

94

1

오타 제보 드립니다.

0

74

2

벌크 연산과 flush, clear

0

77

1

Run As Intellij 로 변경시 Q타입 import 불가

0

90

1

QHello import하기 문제 발생

0

149

2

등록된 함수 보는법(H2Dialect) 질문

0

70

2

5.0부터 Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다고 하는데 이에 맞는 강의

1

201

2

[환경설정 PDF 부트 3.0이후 설명 질문] build.gradle에 compileQuerydsl을 정의하지 않은 상태에서 Gradle->Tasks->other->compileQuerydsl을 클릭하라고 하는 이유가 무엇인가요??

1

203

1

querydsl 설정 문제

0

223

2

quey dsl 설정부분

0

159

2

count 쿼리 관련 질문입니다!

0

75

1

stringtemplate를 이용하여 where절 검색 방법 질문 드립니다.

0

90

1

답변부탁드리겠습니다.

0

91

2

(OrderSpecifier)관련 내용 어디있을가요

0

67

1

중급문법 벌크연산에서

0

84

2