인프런 커뮤니티 질문&답변

bbb3631님의 프로필 이미지
bbb3631

작성한 질문수

실전! Querydsl

BooleanExpression을 이용해서 쿼리 검색

작성

·

567

·

수정됨

0

안녕하세요! BooleanExpression으로 메소드를 만들어 필터링 기능을 구현중입니다.

Repository에서 이런식으로 BooleanExpression 메소드를 and으로 엮었습니다.

return queryFactory.selectFrom(member)
        .innerJoin(member.activities, activities)
.where(checkActivityContainsPart(part), checkMemberBelongToTeam(team))
private BooleanExpression checkActivityContainsPart(String part) {
    if (part == null) return null;
    return QMemberSoptActivity.memberActivity.part.contains(part);
}
private BooleanExpression checkMemberBelongToTeam(String team) {
        if (team == null) return null;
        switch (team) {
            case "임원진" -> {
                return QMemberSoptActivity.memberActivity.part.contains("회장")
                        .or(QMemberSoptActivity.memberActivity.part.contains("부회장")); // 회장, 부회장, ~파트장, 운영 팀장, 미디어 팀장
            }
            case "운영팀" -> {
                return QMemberSoptActivity.memberActivity.part.contains("총무"); // 회장, 부회장, ~파트장, 운영 팀장, 미디어 팀장
            }
            default -> {
                return null;
            }
        }

    }

memberActivity에는 파트원인지, 회장인지에 대한 활동 정보가 들어있습니다.

어떤 기수에서는 회장을, 어떤 기수에서는 파트원을 했을 경우가 있습니다.

이 모든 경우에 맞는 회원을 찾는 것이목표인데, 조건이 and( ) and( )으로 엮어지면서,
메소드checkActivityContainsPart()와 checkMeberBelongToTeam() 조건을 모두 포함하는 경우를 찾지 못합니다. (하나하나 조건을 줄때는 구해지지만, 둘다 모두 필터링 걸었을때는 찾아지지 않아요..)

이를 가독성 있게 분리하면서 해결할 수 잇는 방법이 있을까요?


원하는 쿼리는 (activities.part like ? and activities.part like ? or activities.part like ? or activities.part like ?) 이렇게 다 엮이는 것입니다!

답변 1

0

안녕하세요. bbb3631님, 공식 서포터즈 David입니다.

콤마로 연결하면 첫번째 조건과 두번째 조건을 괄호(우선순위 연산자)로 각 조건을 감싼 뒤 and로 연결하게 됩니다. 원하시는 결과를 얻으시려면 각 조건을 and나 or로 연결해주시면 됩니다.

아래 코드를 참고해 주세요.

.where(checkActivityContainsPart(part).and(checkMemberBelongToTeam(team)))

감사합니다.

bbb3631님의 프로필 이미지
bbb3631
질문자

안녕하세요!

이렇게 and 조건으로 엮을경우, null이 들어올 경우 오류가 나는데

2023-05-01 11:15:03.112 ERROR 19908 --- [nio-8080-exec-2] o.s.m.i.c.GlobalExceptionHandler : [Unknown Error] : Cannot invoke "com.querydsl.core.types.dsl.BooleanExpression.and(com.querydsl.core.types.Predicate)" because the return value of "Repository.checkActivityContainsGeneration(java.lang.Integer)" is null

 

해결방법이 있나요?

bbb3631님의 프로필 이미지
bbb3631
질문자

imageimage분기처리했을때 나가는 쿼리는 이렇게 되는데,

Booleanexpression으로 .and조건을 엮으면 이렇게 쿼리가 나가게 되더라구요

image

해결방안이 있을지 궁금합니다..

bbb3631님의 프로필 이미지
bbb3631

작성한 질문수

질문하기