개요
- 동적 쿼리를 해결하는 두 가지 방식
- BooleanBuilder
- Where 다중 파라미터 사용
BooleanBuilder
@Test
void dynamicQuery_BooleanBuilder() {
//given
String userNameParam = "member1";
Integer ageParam = 10;
//when
List<Member> result = searchMember(userNameParam, ageParam);
//then
assertThat(result.size()).isEqualTo(1);
}
private List<Member> searchMember(String userNameParam, Integer ageParam) {
// 생성자를 통해 초기 값을 넣을 수도 있다.
BooleanBuilder builder = new BooleanBuilder();
if (userNameParam != null) {
builder.and(member.userName.eq(userNameParam));
}
if (ageParam != null) {
builder.and(member.age.eq(ageParam));
}
return jpaQueryFactory
.selectFrom(member)
.where(builder)
.fetch();
}
Where 다중 파라미터 사용
@Test
void dynamicQuery_WhereParam() {
//given
String userNameParam = "member1";
Integer ageParam = 10;
//when
List<Member> result = searchMember2(userNameParam, ageParam);
//then
assertThat(result.size()).isEqualTo(1);
}
private List<Member> searchMember2(String userNameParam, Integer ageParam) {
return jpaQueryFactory
.selectFrom(member)
.where(userNameEq(userNameParam), ageEq(ageParam)) // where 조건에 null 무시
.fetch();
}
private BooleanExpression userNameEq(String userNameParam) {
return userNameParam != null ? member.userName.eq(userNameParam) : null;
}
private BooleanExpression ageEq(Integer ageParam) {
return ageParam != null ? member.age.eq(ageParam) : null;
}
- where 조건에 null 값은 무시된다.
- 메서드를 다른 쿼리에서도 재활용 할 수 있다.
- 쿼리 자체의 가독성이 높아진다.
조합 기능
private BooleanExpression allEq(String userNameParam, Integer ageParam) {
return userNameEq(userNameParam).and(ageEq(ageParam));
}
- 여러 메서드를 조합해서 사용할 수도 있다.
- null 체크는 주의해서 처리해야 한다.