Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

동적쿼리 : BooleanBuilder, Where 다중 파라미터 본문

인프런/[인프런] QueryDsl

동적쿼리 : BooleanBuilder, Where 다중 파라미터

Seung__ 2021. 9. 3. 22:59

1. 동적쿼리 두 가지 방법


  • BooleanBuilder
  • Where 다중 파라미터 사용

 

 

2. BooleanBuilder


  • booleanBuilder에 and, or 조건 추가 가능.
    private List<Member> searchMember1(String usernameCon, Integer ageCon) {

        BooleanBuilder builder = new BooleanBuilder();
        if(usernameCon != null){
            builder.and(member.username.eq(usernameCon)); //booleanbuild에 and조건 추가
        }

        if(ageCon!=null){
            builder.and(member.age.eq(ageCon));
        }

        return queryFactory
                .selectFrom(member)
                .where(builder)
                .fetch();
    }
    select
        member1 
    from
        Member member1 
    where
        member1.username = ?1 
        and member1.age = ?2

 

 

3. Where 다중 파라미터 사용 : 히힛


  • ㅠwhere의 조건들은 and로 묶임
  • where 조건에 null 값은 무시된다.
  • 메서드를 다른 쿼리에서도 재활용 할 수 있다.
  • 쿼리 자체의 가독성이 높아진다.
    @Test
    public void dynamicQuery_WhereParam(){
        String usernameParam = "member1";
        Integer ageParam = 10;

        List<Member> result =  searchMember2(usernameParam, ageParam);
        assertThat(result.size()).isEqualTo(1);
    }

    private List<Member> searchMember2(String usernameCon, Integer ageCon) {

        return queryFactory
                .selectFrom(member)
                .where(usernameEq(usernameCon), ageEq(ageCon)) //where에 null들어가면 무시. 여러 조건이 들어가면 and로 처리됨.
                .fetch();
    }

    private BooleanExpression usernameEq(String usernameCon) {
        return usernameCon == null ? null : member.username.eq(usernameCon);
    }

    private BooleanExpression ageEq(Integer ageCon) {
        return ageCon == null ? null : member.age.eq(ageCon);
    }
select
        member1 
    from
        Member member1 
    where
        member1.username = ?1 
        and member1.age = ?2
  • 심지서 각 where 조건은 메서드로 뽑았기 때문에 조립도 가능.
    @Test
    public void dynamicQuery_WhereParam(){
        String usernameParam = "member1";
        Integer ageParam = 10;

        List<Member> result =  searchMember2(usernameParam, ageParam);
        assertThat(result.size()).isEqualTo(1);
    }

    private List<Member> searchMember2(String usernameCon, Integer ageCon) {

        return queryFactory
                .selectFrom(member)
                //.where(usernameEq(usernameCon), ageEq(ageCon)) //where에 null들어가면 무시. 여러 조건이 들어가면 and로 처리됨.
                .where(allEq(usernameCon, ageCon))
                .fetch();
    }

    private BooleanExpression usernameEq(String usernameCon) {
        return usernameCon == null ? null : member.username.eq(usernameCon);
    }

    private BooleanExpression ageEq(Integer ageCon) {
        return ageCon == null ? null : member.age.eq(ageCon);
    }

    private BooleanExpression allEq(String usernameCon, Integer ageCon){
        return usernameEq(usernameCon).and(ageEq(ageCon));
    }

 

4. GitHub : 210903 Dynamic Query


 

GitHub - bsh6463/Querydsl

Contribute to bsh6463/Querydsl development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] QueryDsl' 카테고리의 다른 글

SQL Function 호출  (0) 2021.09.04
벌크 연산  (0) 2021.09.04
프로젝션과 결과 반환 : DTO, @QueryProjection  (0) 2021.09.03
프로젝션과 결과 반환 - DTO 조회  (0) 2021.09.03
프로젝션과 결과 반환  (0) 2021.09.03
Comments