영한님이 실무에서 좋아하는 방법
@Test
public void dynamicQuery_WhereParam() {
String usernameParam = "member1";
Integer ageParam = null;
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) {
return usernameCond != null ? member.username.eq(usernameCond) : null;
}
private BooleanExpression ageEq(Integer ageCond) {
return ageCond != null ? member.age.eq(ageCond) : null;
}
where에서 null 값을 무시가 된다. 이를 이용해서 만든다.
메소드를 재활용 할 수도 있고 메소드 명을 잘 지으면 더 가독성이 좋아진다.
초기 값은 메소드 내에서 코드로 자유롭게 표현 가능하다.
private Predicate ageEq(Integer ageCond) {
return ageCond != null ? member.age.eq(ageCond) : member.age.eq(10);
}
메소드로 뺏기 때문에 조립도 가능하다.
private BooleanExpression allEq(String usernameCond, Integer ageCond) {
return usernameEq(usernameCond).and(ageEq(ageCond));
}