작성
·
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
분기처리했을때 나가는 쿼리는 이렇게 되는데,
Booleanexpression으로 .and조건을 엮으면 이렇게 쿼리가 나가게 되더라구요
해결방안이 있을지 궁금합니다..
안녕하세요!
이렇게 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
해결방법이 있나요?