반응형
JPA에서 동적 쿼리를 해결하는 방법
- 조건에 따라 문자열을 만들어 query문을 만들고 파라미터를 주는 방법
- JPA Criteria (JPA 표준 스펙)
- Query DSL를 통한 동적 쿼리 생성
Query DSL 동적 쿼리 만드는 방법
- BooleanBuilder
- Where 다중 파라미터 사용
1. BooleanBuilder
@Test
void dynamicQueryUsingBooleanBuilder(){
String usernameParam = "member";
Long ageParam = 10;
List<Member> result = searchMember(usernameParam, ageParam);
assertThat(result.size()).isEqualTo(1);
}
private List<Member> searchMember(String usernameParam, Long ageParam) {
BooleanBuilder builder = new BooleanBuilder();
if(usernameParam != null) {
builder.and(member.username.eq(usernameParam));
}
if(ageParam != null) {
builder.and(member.age.eq(ageParam));
}
return jpaQueryFactory
.selectFrom(member)
.where(builder)
.fetch();
}
- 조건에 따라 builder.and() 메서드를 통해 구성합니다.
2. Where 다중 파라미터 사용
예제 1)
@Test
void dynamicQueryUsingWhereParameter(){
String usernameParam = "member";
Integer ageParam = 10;
List<Member> result = searchMember(usernameParam, ageParam);
assertThat(result.size()).isEqualTo(1);
}
private List<Member> searchMember(String usernameCond, Integer ageCond) {
return jpaQueryFactory
.selectFrom(member)
.where(usernameEq(usernameCond), ageEq(ageCond))
.fetch();
}
private Predicate usernameEq(String usernameCond) {
if(usernameCond == null) return null;
return member.username.eq(usernameCond);
}
private Predicate ageEq(Integer ageCond) {
if(ageCond == null) return null;
return member.age.eq(ageCond);
}
예제 2) Where 파라미터 형식으로 조건 추상화 시킴
@Test
void dynamicQueryUsingWhereParameter(){
String usernameParam = "member";
Long ageParam = 10;
List<Member> result = searchMember(usernameParam, ageParam);
assertThat(result.size()).isEqualTo(1);
}
private List<Member> searchMember(String usernameParam, Long ageParam) {
return jpaQueryFactory
.selectFrom(member)
.where(allEq(usernameParam, ageParam))
.fetch();
}
private BooleanExpression allEq(String usernameParam, Long ageParam) {
return usernameEq1(usernameParam).and(ageEq(ageParam));
}
private BooleanExpression usernameEq1(String usernameCond) {
if(usernameCond == null) return null;
return member.username.eq(usernameCond);
}
private BooleanExpression ageEq1(Long ageCond) {
if(ageCond == null) return null;
return member.age.eq(ageCond);
}
반응형
'Spring Data > Query DSL' 카테고리의 다른 글
QueryDSL Spring Data JPA + 동적 쿼리 (0) | 2023.01.18 |
---|---|
QueryDSL 벌크 쿼리 (0) | 2023.01.16 |
QueryDSL DTO에 값 담기 (0) | 2023.01.15 |
QueryDSL 문법 (0) | 2023.01.15 |
QueryDSL Spring Data JPA 같이 적용하기 (0) | 2023.01.14 |