카테고리 없음

[QueryDSL] BooleanBuilder란?

jojelly 2022. 3. 31. 18:18
반응형

QueryDsl 에서 동적 쿼리를 해결하는 두가지 방식

1. BooleanBuilder

 

2. where절에 조건으로 사용


BooleanBuilder란?

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

 


1. BooleanBuilder 를 통한 정적 쿼리 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  @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();
    }
cs

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

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

 

 

 

 

2.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
31
32
33
34
35
@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);
    }
Colored by Color Scripter
cs

 

조건별로 메서드를 따로 빼서 where 절에 넣는다 , 만약 메서드에서 where 절로 null이 반환되면  where 절에서는 해당 조건이 무시 되기 때문에 동적쿼리가 가능하다 .

 

조건 메서드들은 다른 곳에서 재사용이 가능하고 BooleanExpression 으로 반환하면 메서드들 끼리 조합도 가능하다는게 큰 장점이다. ( allEq() 처럼 조합이 가능함 )

 

booleanBuilder 보다는 where 절 동적쿼리를 활용하자.

 

 

 

 

 

 

 

 

 

반응형