BooleanExpression을 이용해서 쿼리 검색
655
작성한 질문수 4
안녕하세요! 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)))감사합니다.
0
안녕하세요!
이렇게 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

분기처리했을때 나가는 쿼리는 이렇게 되는데,
Booleanexpression으로 .and조건을 엮으면 이렇게 쿼리가 나가게 되더라구요

해결방안이 있을지 궁금합니다..
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





