반응형
QueryDsl 에서 동적 쿼리를 해결하는 두가지 방식
- BooleanBuilder
-where절에 조건으로 사용
1. BooleanBuilder 를 통한 동적 쿼리
private List<Member> searchMember1(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 qf
.selectFrom(member)
.where(builder)
.fetch();
}
BooleanBuilder를 사용하여 StringBulider 처럼 쿼리를 조건별로 쿼리를 쌓아서 동적 쿼리로 쓸 수 있다 .
코드가 조금 지저분한 단점이 있지만 사용하기 편리하다 .
2.where 절 조건을 통한 동적 쿼리
//where 문에서 동적쿼리
@Test
public void dynamicQuery_WhereParam(){
String usernameParam = "member1";
Integer ageParam = 10 ;
List<Member> result = searchMember2(usernameParam,ageParam);
assertThat(result.size()).isEqualTo(1);
}
//where에 null이 들어가면 무시된다 .
//때문에 동적쿼리가 가능하다 .
//메서드를 다른 쿼리에서 재활용 할 수도 있다 .
//쿼리 자체에 가독성이 높아진다 .
//BooleanExpression에서 메서드끼리 조합이 가능하다
private List<Member> searchMember2(String usernameCond, Integer ageCond) {
return qf
.selectFrom(member)
.where(usernameEq(usernameCond),ageEq(ageCond))
.fetch();
}
private BooleanExpression ageEq(Integer ageCond) {
return ageCond != null ? member.age.eq(ageCond) : null ;
}
private BooleanExpression usernameEq(String usernameCond) {
return usernameCond != null ? member.username.eq(usernameCond) : null;
}
private BooleanExpression allEq(String usernameCond, Integer ageCond){
return usernameEq(usernameCond).and(ageEq(ageCond));
}
조건별로 메서드를 따로 빼서 where 절에 넣는다 , 만약 메서드에서 where 절로 null이 반환되면 where 절에서는 해당 조건이 무시 되기 때문에 동적쿼리가 가능하다 .
조건 메서드들은 다른 곳에서 재사용이 가능하고 BooleanExpression 으로 반환하면 메서드들 끼리 조합도 가능하다는게 큰 장점이다. ( allEq() 처럼 조합이 가능함 )
booleanBuilder 보다는 where 절 동적쿼리를 활용하자.
반응형
'JPA > QueryDSL' 카테고리의 다른 글
QueryDSL 공부 8 - Repository에서 활용 (0) | 2021.06.20 |
---|---|
QueryDSL 공부 7 - 수정 , 삭제 벌크성 쿼리 (0) | 2021.06.19 |
QueryDSL 공부 5 - 프로젝션과 결과 반환 (0) | 2021.06.19 |
QueryDSL 공부 4 - QueryDSL 활용2 (join문) (0) | 2021.06.19 |
QueryDSL 공부 3 - QueryDSL 활용1 (0) | 2021.06.18 |