우선
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();
}
|
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);
}
|
cs |
BooleanExpression 을 이용하여 명시적으로 알 수 있는(보기편한) 코드를 작성할 수 있게 됩니다.
그리고 null이 반환시 자동으로 조건절에서 제거가 됩니다.
다만 모든 조건에서 null 이 발생할 경우 Exception이 발생되니 주의가 필요합니다.
반응형