inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! Querydsl

BooleanExpression을 이용해서 쿼리 검색

655

bbb3631

작성한 질문수 4

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 ?) 이렇게 다 엮이는 것입니다!

java jpa

답변 1

0

David

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

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

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

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

감사합니다.

0

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

 

해결방법이 있나요?

0

bbb3631

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

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

image

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

SpringBoot 4.X에서의 Querydsl 설정

0

105

2

querydsl 오픈소스에 대한 질문

1

82

1

예제에서의 카운트 쿼리에서 join문과 where문은 필요없지 않나요?

0

113

1

Querydsl 6.X버전에 대해서 어떻게 생각하시나요?

0

326

2

여러 테이블 조인하여 통계치를 구하고자 할 때 어떤 방법이 더 효율적일까요

1

73

1

fetchResults()는 더이상 권장되지 않는다는데 맞나요?

0

164

1

querydsl sum() 메서드 없어요.

0

163

2

build 디렉터리 생성

0

142

2

자바 ORM 표준 JPA 프로그래밍 - 기본편 듣고 바로 학습해도 괜찮을까요?

0

116

2

현재 Querydsl에서 from절 서브쿼리를 지원하나요?

0

94

1

오타 제보 드립니다.

0

74

2

벌크 연산과 flush, clear

0

77

1

Run As Intellij 로 변경시 Q타입 import 불가

0

90

1

QHello import하기 문제 발생

0

150

2

등록된 함수 보는법(H2Dialect) 질문

0

70

2

5.0부터 Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다고 하는데 이에 맞는 강의

1

201

2

[환경설정 PDF 부트 3.0이후 설명 질문] build.gradle에 compileQuerydsl을 정의하지 않은 상태에서 Gradle->Tasks->other->compileQuerydsl을 클릭하라고 하는 이유가 무엇인가요??

1

203

1

querydsl 설정 문제

0

223

2

quey dsl 설정부분

0

159

2

count 쿼리 관련 질문입니다!

0

75

1

stringtemplate를 이용하여 where절 검색 방법 질문 드립니다.

0

90

1

답변부탁드리겠습니다.

0

91

2

(OrderSpecifier)관련 내용 어디있을가요

0

67

1

중급문법 벌크연산에서

0

84

2