TIL

querydsl에서의 조건문처리 삽질기

하얀잔디 2023. 2. 15. 13:16
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