본문 바로가기

백엔드/QueryDSL

QueryDSL - 동적 쿼리

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의 기초부터 실무 활용까지 한번에 해결, 본 강의는 자바 백엔드 개발의 실전 코스를 완성하는 마지막 강의 입니다. 스프링 부트와 JPA 실무 완전 정복 로드맵을 우선 확인해주세요. 로드

www.inflearn.com

 

 

 

'백엔드 > QueryDSL' 카테고리의 다른 글

QueryDSL 프로젝션, DTO 사용  (0) 2021.09.01
쿼리 dsl 기초  (0) 2021.08.30
쿼리 dsl 입문  (0) 2021.08.30