BooleanBuilder
를 통해 동적 쿼리를 처리한다.
파라미터로null
이 반환되면 그 조건은 무시된다.
-> 만약 모든 조건의 파라미터가 null
이라면 텅 빈 BooleanBuilder()
가 where
문에 들어간다.
이 경우 아래와 같이where
문을 배제하고 쿼리를 날리기 때문에 모든 엔티티가 출력된다.
select
m1_0.member_id,
m1_0.age,
m1_0.team_id,
m1_0.username
from
member m1_0
@Test
public void dynamicQuery_BooleanBuilder() {
String usernameParam = "member1";
Integer ageParam = 10;
List<Member> result = searchMember1(usernameParam, ageParam);
assertThat(result.size()).isEqualTo(1);
}
private List<Member> searchMember1(String usernameCond, Integer ageCond) {
BooleanBuilder builder = new BooleanBuilder();
if (usernameCond != null) {
builder.and(member.username.eq(usernameCond));
}
if (ageCond != null) {
builder.and(member.age.eq(ageCond));
}
return queryFactory
.selectFrom(member)
.where(builder)
.fetch();
}
BooleanBuilder()
와 달리 where
문에 들어가는 조건을 메소드로 직접 구현한다.
마찬가지로 null
을 반환할 경우 해당 조건이 없는 것으로 취급한다.
메서드를 다른 쿼리에서도 재사용할 수 있는 장점이 있다.
@Test
public void dynamicQuery_WhereParam() {
String usernameParam = "member1";
Integer ageParam = 10;
List<Member> result = searchMember2(usernameParam, ageParam);
assertThat(result.size()).isEqualTo(1);
}
private List<Member> searchMember2(String usernameCond, Integer ageCond) {
return queryFactory
.selectFrom(member)
.where(usernameEq(usernameCond), ageEq(ageCond))
.fetch();
}
private BooleanExpression usernameEq(String usernameCond) {
if (usernameCond == null) {
return null;
}
return member.username.eq(usernameCond);
}
private BooleanExpression ageEq(Integer ageCond) {
if (ageCond == null) {
return null;
}
return member.age.eq(ageCond);
}
참고 :