객체 생성 시점에 생성자에 파라미터를 던지는 방식으로 기본 값을 지정할 수 있음
where절에 생성된 객체를 넣어주면 끝
where절에 null을 넣게되면 그냥 무시가 됨
where절에 들어가는 값으로 method를 던져 줌
다이나믹 쿼리를 위해 생성한 method들을 재활용할 수도 있음
다중 조건을 골라서 조립할 수도 있음
(메소드별로 명확한 명칭을 주면 쿼리 가독성도 높아짐)
중요 !
null 체크는 반드시 해야한다.
@Test
public void dynamicQuery() {
String usernameParam = "member1";
Integer ageParam = 10;
// BooleanBuilder 사용
List<Member> resultA = searchMemberWithBooleanBuilder(usernameParam, ageParam);
// where절 다중 파라미터
List<MemberDto> resultB = searchMemberWithMultiWhere(usernameParam, ageParam);
assertThat(resultA.size()).isEqualTo(1);
assertThat(resultB.size()).isEqualTo(1);
}
private List<Member> searchMemberWithBooleanBuilder(String usernameCond, Integer ageCond) {
// 초기값 지정 가능
// BooleanBuilder builder = new BooleanBuilder(member.username.eq(usernameCond));
BooleanBuilder builder = new BooleanBuilder();
if(usernameCond != null) {
builder.and(member.username.eq(usernameCond));
}
if(ageCond != null) {
builder.and(member.age.eq(ageCond));
}
return jpaQueryFactory
.selectFrom(member)
.where(builder)
.fetch();
}
private List<MemberDto> searchMemberWithMultiWhere(String usernameCond , Integer ageCond) {
return jpaQueryFactory
.select(new QMemberDto(member.username, member.age))
.from(member)
.where(usernameEq(usernameCond), ageEq(ageCond))
//.where(allEq(usernameCond, ageCond))
.fetch();
}
private BooleanExpression usernameEq(String usernameCond) {
return usernameCond == null ? null : member.username.eq(usernameCond);
}
private BooleanExpression ageEq(Integer ageCond) {
return ageCond == null ? null : member.age.eq(ageCond);
}
private BooleanExpression allEq(String usernameCond, Integer ageCond) {
return usernameEq(usernameCond).and(ageEq(ageCond));
}