[Querydsl] 동적 쿼리를 BooleanExpression 으로 작성하기

2021. 4. 26. 02:54·Framework & Runtime/SpringBoot

우선

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override
public List<Member> findDynamicQuery(String name, String age, String phoneNumber) {
    BooleanBuilder builder = new BooleanBuilder();
    
    if (!StringUtils.isEmpty(name))
        builder.and(member.name.eq(name));
    if (!StringUtils.isEmpty(age))
        builder.and(member.age.eq(age));
    if (!StringUtils.isEmpty(phoneNumber))
        builder.and(member.phoneNumber.eq(phoneNumbeR));
 
    return queryFactory
            .selectFrom(member)
            .where(builder)
            .fetch();
}
Colored by Color Scripter
cs

이러한 식으로 동적 쿼리를 구성한 메소드가 있습니다.

 

여러개의 if로 구성되어 있어 한눈에 어떤 쿼리인지 예상하기가 어렵습니다.

더 많은 인자를 받는다면 더욱 어려워질 것입니다.

 

여기서 가장 괜찮은 솔루션 방법으로 BooleanExpression이 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Override
public List<Member> findDynamicQuery(String name, String age, String phoneNumber) {
    return queryFactory
            .selectFrom(member)
            .where(eqName(name),
                    eqAge(age),
                    eqPhoneNumber(phoneNumber))
            .fetch();
}
 
private BooleanExpression eqName(String name) {
    if (StringUtils.isEmpty(name)) return null;
    else return member.name.eq(name);
}
 
private BooleanExpression eqAge(String age) {
    if (StringUtils.isEmpty(age)) return null;
    else return member.age.eq(age);
}
Colored by Color Scripter
cs

BooleanExpression 을 이용하여 명시적으로 알 수 있는(보기편한) 코드를 작성할 수 있게 됩니다.

 

그리고 null이 반환시 자동으로 조건절에서 제거가 됩니다.

다만 모든 조건에서 null 이 발생할 경우 Exception이 발생되니 주의가 필요합니다.

 

반응형
저작자표시 비영리 (새창열림)
'Framework & Runtime/SpringBoot' 카테고리의 다른 글
  • RestTemplate 와 ObjectMapper 활용기(스프링에서 다른 서버의 JSON API Token 을 가져와서 이용해야 할 때)
  • Kotlin Spring Boot 에 Querydsl 종속성이 추가된 프로젝트 소스 공유
  • Spring Boot REST API Spring Security 고유키 만들어서 접근 제한하기(api key and secret)
  • [Querydsl] 하나의 응답을 원할 때, exist 사용을 자제하자.
Kua
Kua
정보 공유, 개인 정리 공간 입니다.
  • Kua
    Kua's Miscellaneous
    Kua
    • 분류 전체보기 (185)
      • 대문 (2)
      • Tips (25)
        • Chrome (2)
        • Windows (4)
        • IDE (3)
        • 기타 (16)
      • CodingTest (44)
      • Language (20)
        • PHP (5)
        • C# (7)
        • Java (1)
        • Kotlin (7)
      • Framework & Runtime (16)
        • SpringBoot (12)
        • Node.js (2)
        • Vue.js (1)
        • Gradle (1)
      • DevOps (13)
        • Linux (1)
        • Docker (4)
        • Kubernetes (2)
        • Apache Kafka (1)
        • AWS (1)
      • 일상다반사 (53)
        • 도서 (1)
        • 개발 (8)
        • 후기 - IT (7)
        • 후기 - 일상 (13)
        • 차가리 (4)
        • 방송통신대학교 (4)
        • 음식 (2)
      • Games (12)
        • Minecraft (7)
        • VR (2)
        • 그외 (3)
  • 최근 글

  • 인기 글

  • 태그

    codingtest
    Spring Boot
    minecraft
    bronze2
    Plugin
    후기
    c#
    Algorithm
    Kotlin
    갤럭시
    github
    코딩테스트
    java
    bronze1
    Silver5
    알고리즘
    Windows
    error
    spring
    백준
  • 전체
    오늘
    어제
  • hELLO· Designed By정상우.v4.10.0
Kua
[Querydsl] 동적 쿼리를 BooleanExpression 으로 작성하기
상단으로

티스토리툴바