private BooleanExpression FindAllEventList(LocalDateTime start, LocalDateTime end) {
if (event.rrule == null) { //일반 이벤트{
System.out.println(" 1번경우");
return (DateBetween(start, end).or(DateInclude(start, end))).and(ExceptboundaryValue(start));
} else // 반복이벤트 경우
{
System.out.println(" 2번경우");
return (NotEndedRepeat(start).or(RepeatEndDateNull()));
}
}
위와 같은 코드가 있다고 해보자.
나는 위 코드가
"event" 테이블의 "rrule"이라는 컬럼값이 null인지 아닌지에 따라 두가지 경우로 나눠서 쿼리가 작성되는줄 알았는데,
event.rrule 은 위에 1번경우는 안타고 2번경우로만 왔다.
이유는 , querydsl에서 저런 거는
event.rrule 값은 StringPath << 라는 객체로 들어온다.
?????
String은 문자열인건 알겠는데, StringPath는 또 뭐지??
In Querydsl, a StringPath represents a path to a string-typed property or field of an entity in a query. It can be used to create expressions for filtering or ordering based on the value of the property.
이라고한다.
StringPath는 쿼리dsl에서 expression을 만들때 , 사용되는 객체이름이다. ..
또한, querydsl에서는 if - else 문을 사용할 수 없다고한다!!
김영한님의 querydsl 강의를 봤는데,
이런식으로 when을 사용하면서 하면 된다.. 고하는데??
이걸 어떻게해~ 뭔지모르겠어 어떠해 어떠해
조심조심..
그래서 삽질2.
return Expressions.cases().when(event.rrule.isNull())
.then((Predicate) DateBetween(start, end).or(DateInclude(start, end))
.and(ExceptboundaryValue(start)))
.otherwise(NotEndedRepeat(start).or(RepeatEndDateNull()));
위 코드도 틀렸다..
3.
private BooleanExpression FindAllEventList(LocalDateTime start, LocalDateTime end) {
return Expressions.booleanOperation(Ops.OR,
event.rrule.isNull(),
Expressions.booleanOperation(Ops.AND,
DateBetween(start, end).or(DateInclude(start, end)),
ExceptboundaryValue(start)
),
Expressions.booleanOperation(Ops.AND,
NotEndedRepeat(start),
RepeatEndDateNull()
)
);
}
위와같이, Expressions.booleanOperation을 사용하면 되었다!!
Ops.OR -> 2개 이상의 Expression에서 사용가능.
Ops.AND -> 2개.
+
JPQL은 LocalDateTime 을 파라미터로 갖지 못한다.
'TIL' 카테고리의 다른 글
1번에 동시에 여러 Entity 저장하기 Spring (0) | 2023.02.27 |
---|---|
pvc 란 , 쿠버네틱스 볼륨이란 (0) | 2023.02.23 |
LocalDatetime 원하는 날짜 설정. (0) | 2023.02.09 |
/* vs /** (0) | 2023.02.03 |
FCM 알람이란 (0) | 2023.01.31 |