BooleanBuilder
@Test
public void dynamic1() {
List<Member> members = searchMember(null, 15);
for (Member member1 : members) {
System.out.println("member1.getUsername() = " + member1.getUsername());
}
}
private List<Member> searchMember(String username, Integer age){
BooleanBuilder builder = new BooleanBuilder();
if (username != null) builder.and(member.username.eq(username));
if (age != null) builder.and(member.age.eq(age));
return qf.selectFrom(member).where(builder).fetch();
}
builder 에다가 and 조건으로 이어붙여서 실행해보는 예제이다. username은 null 이므로 age에 대한 조건만 들어가서
where 절에 age 조건으로 쿼리가 나간다.
Where 다중 파라미터✨✨
쿼리 dsl의 where() 함수에는 여러개의 조건을 넣을 수 있었던 점을 응용한 방법이다. where 내에 null 인자가 들어오면 무시하기 때문에 이런 것이 가능하다.
@Test
public void dynamic1() {
List<Member> members = searchMember2(null, 15);
for (Member member1 : members) {
System.out.println("member1.getUsername() = " + member1.getUsername());
}
}
private List<Member> searchMember2(String username, Integer age){
return qf.selectFrom(member)
.where(usernameEq(username), ageEq(age)).fetch();
}
private BooleanExpression ageEq(Integer age) {
if (age != null) return member.age.eq(age);
return null;
}
private BooleanExpression usernameEq(String name) {
if (name != null) return member.username.eq(name);
return null;
}
핵심은 메소드 이름을 잘 짓는 것이다. 이렇게 했을 경우 가독성이 훨씬 더 좋아진다. 이렇게 하면 순수함수들을 조합하며 만들어내는 함수형 프로그래밍이 가능하다. 위의 ageEq와 usernameEq를 합친 ageAndUsernameEq 함수도 만들어서 더욱 편하게 사용하는 것을 고려해볼 수도 있을 것이다.
관련글
https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84/dashboard
'백엔드 > QueryDSL' 카테고리의 다른 글
QueryDSL 프로젝션, DTO 사용 (0) | 2021.09.01 |
---|---|
쿼리 dsl 기초 (0) | 2021.08.30 |
쿼리 dsl 입문 (0) | 2021.08.30 |