동적 쿼리를 해결하는 두가지 방식
- BooleanBuilder
- Where 다중 파라미터 사용
BooleanBuilder을 써보면 파라미터 두개를 넣었기 때문에 동적쿼리에서 둘 다 결과가 조회 되어야 한다.
@Test
public void dynamicQuery_BooleanBuilder() {
// username이 1이고 나이가 10살인 사람을 찾으려 한다.
String usernameParam = "member1";
Integer ageParam = 10;
List<Member> result = searchMember1(usernameParam, ageParam);
assertThat(result.size()).isEqualTo(1);
}
// 파라미터의 값이 null이냐 아니냐에 따라서 동적으로 바뀌게 된다.
private List<Member> searchMember1(String usernameCond, Integer ageCond) {
BooleanBuilder builder = new BooleanBuilder();
// usernameCond 파라미터가 null이 아니면
if (usernameCond != null) {
// BooleanBuilder에다가 and 조건을 하나 넣어준다.
// 그러면 member username이 equal이다.
builder.and(member.username.eq(usernameCond));
}
// 이름이 둘다 있으면 빌더에 들어갈거고
// username이 없고 age에 하나만 있으면 하나에만 들어갈 것이다.
if (ageCond != null) {
builder.and(member.age.eq(ageCond));
}
return queryFactory
.selectFrom(member)
// 빌더의 결과를 where에 넣어준다.
.where(builder)
.fetch();
}
// 결과 JPQL을 보면 파라미터 바인딩 두개가 된것을 볼 수 있다.
/* select
member1
from
Member member1
where
member1.username = ?1
and member1.age = ?2
// SQL도 마찬가지
select
member0_.id as id1_1_,
member0_.age as age2_1_,
member0_.team_id as team_id4_1_,
member0_.username as username3_1_
from
member member0_
where
member0_.username=?
and member0_.age=?
만약 age가 null이면 usernameParam에만 들어가게 된다.
@Test
public void dynamicQuery_BooleanBuilder() {
// username이 1이고 나이가 10살인 사람을 찾으려 한다.
String usernameParam = "member1";
Integer ageParam = null;
List<Member> result = searchMember1(usernameParam, ageParam);
assertThat(result.size()).isEqualTo(1);
}
username만 들어가고 age는 없다.
/* select
member1
from
Member member1
where
member1.username = ?1
select
member0_.id as id1_1_,
member0_.age as age2_1_,
member0_.team_id as team_id4_1_,
member0_.username as username3_1_
from
member member0_
where
member0_.username=?
즉 null이면 아래코드를 실행을 안한다.
// 이름이 둘다 있으면 빌더에 들어갈거고
// username이 없고 age에 하나만 있으면 하나에만 들어갈 것이다.
if (ageCond != null) {
builder.and(member.age.eq(ageCond));
}
usernameCond가 필수다 가정하면 아래와 같이 QuerydslBasicTest에서 설정을 해줄수가 있다.
usernameCond
BooleanBuilder builder = new BooleanBuilder(member.username.eq(usernameCond));라고 초기값을 넣어줄 수가 있다.
// 파라미터의 값이 null이냐 아니냐에 따라서 동적으로 바뀌게 된다.
private List<Member> searchMember1(String usernameCond, Integer ageCond) {
BooleanBuilder builder = new BooleanBuilder(member.username.eq(usernameCond));
// usernameCond 파라미터가 null이 아니면
if (usernameCond != null) {
// BooleanBuilder에다가 and 조건을 하나 넣어준다.
// 그러면 member username이 equal이다.
builder.and(member.username.eq(usernameCond));
}
<출처 김영한: 실전! Querydsl >
https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84/dashboard
실전! Querydsl - 인프런 | 강의
Querydsl의 기초부터 실무 활용까지, 한번에 해결해보세요!, - 강의 소개 | 인프런...
www.inflearn.com
'Spring > QueryDSL' 카테고리의 다른 글
수정, 삭제 벌크 연산 - 배치 쿼리 (0) | 2022.04.21 |
---|---|
동적 쿼리 - Where 다중 파라미터 사용 (0) | 2022.04.21 |
프로젝션과 결과 반환 - @QueryProjection (0) | 2022.04.21 |
프로젝션 결과 반환 - DTO 조회 (0) | 2022.04.21 |
프로젝션과 결과 반환 - 기본 (0) | 2022.04.20 |