- 동적 쿼리
1. BooleanBuilder 사용
2. where 다중 파라미터 사용
1. BooleanBuilder
@Test
public void dynamicQuery_BooleanBuilder() {
String usernameParam = "member1";
// Integer ageParam = 10;
Integer ageParam = null;
List<Member> result = searchMember1(usernameParam, ageParam);
assertThat(result.size()).isEqualTo(1);
}
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 queryFactory
.selectFrom(member)
.where(builder)
.fetch();
}
1. 둘 다 null이 아닌경우
- 검색 조건이 둘 다 null이 아닌 경우 정상적으로 where문을 통해 조건 쿼리를 날리는 것을 확인 할 수 있다.
2. 검색 조건 중 null이 있을 경우
- 검색 조건 중 age가 null인 경우 age 관련 쿼리 없이 where 조건 쿼리를 실행하는 것을 확인 할 수 있다.
- BooleanBuilder 객체를 생성한다. 이 객체는 생성된 조건들을 AND나 OR로 연결하기 위한 기본적인 객체다.
- if문을 통해 조건에 부합하면 and를 통해 builder에 AND 연산을 추가한다.
- and, or을 사용하여 작성 할 수 있다. queryFactory에 builder 객체를 넣게 되면 위에서 처리한 조건들이 적용되서 쿼리를 날리게 된다.
2. Where 다중 파라미터 사용
@Test
public void dynamicQuery_WhereParam() {
String usernameParam = "member1";
// Integer ageParam = 10;
Integer ageParam = null;
List<Member> result = searchMember2(usernameParam, ageParam);
assertThat(result.size()).isEqualTo(1);
}
private List<Member> searchMember2(String usernameParam, Integer ageParam) {
return queryFactory
.selectFrom(member)
.where(usernameEq(usernameParam), ageEq(ageParam))
// .where(allEq(usernameParam, ageParam))
.fetch();
}
private BooleanExpression usernameEq(String usernameParam) {
return usernameParam != null ? member.username.eq(usernameParam) : null;
}
private BooleanExpression ageEq(Integer ageParam) {
return ageParam != null ? member.age.eq(ageParam) : null;
}
private BooleanExpression allEq(String usernameParam, Integer ageParam) {
return usernameEq(usernameParam).and(ageEq(ageParam));
}
1. 둘 다 null이 아닌경우
2. 검색 조건 중 null이 있을 경우
- 쿼리 결과는 Booleanbuilder와 동일한 결과를 보여준다.
- where에 메서드를 작성하여 동적 쿼리를 작성하는 방법이다.
- 메서드의 반환 타입은 BooleanExpression으로 하는 것을 권장한다.
- where절의 메서드의 반환값이 null일 경우 해당 메서드는 무시된다.
- 메서드를 사용하여 동적 쿼리를 작성할 경우 메서드를 다른 쿼리에서도 재활용 할 수 있다는 장점이 있고, 쿼리 자체의 가독성이 높아진다.
출처 : 인프런 - 김영한(실전! Querydsl)
'Programming > Querydsl' 카테고리의 다른 글
Querydsl - 순수 JPA와 Querydsl (0) | 2023.07.31 |
---|---|
Querydsl - 중급 문법 (3) 수정, 삭제 벌크 연산 / SQL function 호출 (0) | 2023.07.28 |
Querydsl - 중급 문법 (1) (프로젝션) (0) | 2023.07.28 |
Querydsl - 기본 문법 (3) (조인, 서브 쿼리, Case문, 상수, 문자 더하기) (0) | 2023.07.27 |
Querydsl - 기본 문법 (2) (결과 조회, 정렬, 페이징, 집합) (0) | 2023.07.27 |