Spring

Querydsl 동적 쿼리

yougeun 2023. 4. 26. 00:58
728x90

1.BooleanBuilder

    public List<Member> dynamicQuery_BooleanBuilder(){
        String usernameParam = "member1";
        Integer ageParam = null;

        List<Member> result = searchMember1(usernameParam,ageParam);
        
        return result;
    }

    private List<Member> searchMember1(String usernameCond, Integer ageCond) {
        BooleanBuilder builder = new BooleanBuilder();
        if(usernameCond!=null){
            builder.and(member.username.eq(usernameCond));
        }
        if(ageCond!=null){
            builder.and(member.age.eq(ageCond));
        }

        return queryFactory
                .selectFrom(member)
                .where(builder)
                .fetch();
    }

BooleanBuilder를 선언 한 후 파라미터의 값에 따라 BooleanBuilder에 조건을 추가하여 where의 값에 넣어주면 동적쿼리를 쓸 수 있다.

 

2.Where 다중 파라미터 사용

public List<Member> dynamicQuery_param(){
        String usernameParam = "member1";
        Integer ageParam = null;

        List<Member> result = searchMember2(usernameParam,ageParam);
        
        return result
    }

    private List<Member> searchMember2(String usernameCond, Integer ageCond) {
        return queryFactory
                .selectFrom(member)
//                .where(usernameEq(usernameCond),ageEq(ageCond))
                .where(allEq(usernameCond,ageCond))
                .fetch();
    }

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

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

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

where 조건에 null이 들어가면 무시되는 것을 이용한다.

BooleanExpression을 반환하는 메서드를 조합하여 재사용이 가능하다.

쿼리자체의 가독성이 높아진다.

728x90