• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

BooleanExpression을 이용해서 쿼리 검색

23.04.23 16:39 작성 23.04.23 16:44 수정 조회수 419

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

David님의 프로필

David

2023.04.24

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

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

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

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

감사합니다.

bbb3631님의 프로필

bbb3631

질문자

2023.05.01

안녕하세요!

이렇게 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

질문자

2023.05.01

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

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

image

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