반응형
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 절 동적쿼리를 활용하자.
반응형