◽ JDBC/JPA & Hibernate

[JPA - Querydsl] BooleanBuilder란 무엇인가? ( 동적쿼리, 정적쿼리 )

  간단하게 말하면

쿼리의 조건 설정인 where뒤의 조건을 생성해주는 것이라고 생각하면 된다.

 

 



예제


 

예제 조건

  • name이 오면 where name = name
  • address가 오면 where address = address
  • phoneNumber가 오면 where phoneNumber = phoneNumber
  • 2개 이상이 오면 모두 포함 where name = name and address = address and phoneNumber = phoneNumber

 

기존 사용 방법, BooleanBuilder를 사용할 시 - 정적 쿼리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    @Override
    public List<Academy> findDynamicQuery(String name, String address, String phoneNumber) {
 
        BooleanBuilder builder = new BooleanBuilder();
 
        if (!StringUtils.isEmpty(name)) {
            builder.and(academy.name.eq(name));
        }
        if (!StringUtils.isEmpty(address)) {
            builder.and(academy.address.eq(address));
        }
        if (!StringUtils.isEmpty(phoneNumber)) {
            builder.and(academy.phoneNumber.eq(phoneNumber));
        }
 
        return queryFactory
                .selectFrom(academy)
                .where(builder)
                .fetch();
    }
 

위의 코드를 보면 기존의 iBatis나 myBatis에서 사용하던것과 유사한 것을 볼 수 있을 것이다.
if문으로 필요한 부분만을 BooleanBuilder에 추가하면서 쿼리를 만든 형태이다.

하지만, 단점이 있는데 where문의 조건들이 한눈에 보기 어렵다는 것이다.

 

해결 방법, BooleanExpression를 사용 추천. - 동적 쿼리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Override
    public List<Academy> findDynamicQueryAdvance(String name, String address, String phoneNumber) {
        return queryFactory
                .selectFrom(academy)
                .where(eqName(name),
                        eqAddress(address),
                        eqPhoneNumber(phoneNumber))
                .fetch();
    }
 
    private BooleanExpression eqName(String name) {
        if (StringUtils.isEmpty(name)) {
            return null;
        }
        return academy.name.eq(name);
    }
 
    private BooleanExpression eqAddress(String address) {
        if (StringUtils.isEmpty(address)) {
            return null;
        }
        return academy.address.eq(address);
    }
 
    private BooleanExpression eqPhoneNumber(String phoneNumber) {
        if (StringUtils.isEmpty(phoneNumber)) {
            return null;
        }
        return academy.phoneNumber.eq(phoneNumber);
    }
 

 

푸터바