티스토리 뷰

Variable Between Col1 and Col2 in Querydsl (BooleanExpression)

Querydsl 사용시 기준을 컬럼이 아닌 원하는 변수로 잡고 하는 방법

특정 시간대에 중복이 안되도록 하는 기능을 만드는 도중

startTimeendTime 을 인자로 받는 메소드를 만들었다.

AS-IS

private boolean checkDuplication(LocalDateTime startTime, LocalDateTime endTime) {

        QReservation reservation = QReservation.reservation;

        Reservation findReservation = queryFactory
                .selectFrom(reservation)
                .where(reservation.startTime.between(startTime, endTime)
                    .and(reservation.endTime.between(startTime, endTime)))
                .fetchFirst();

        if (findReservation != null) return true;

        return false;
    }

이런식으로 풀자니 모든 케이스를 대비할 수 없었다.

  • SQL 로 풀어보자
select r.id, r.start_time, r.end_time from reservation r 
where '2020-08-10 09:00:00' between r.start_time and r.end_time
or '2020-08-10 11:00:00' between r.start_time and r.end_time

본인은 이러한 쿼리를 원했다.

DB안에 시간이 기준이 아니라 새로 등록되는 시간을 기준으로 찾는 것이 간단하다고 생각하기 떄문이다.

그래서 Querydsl 에서 기준을 변경해서 찾는 방법을 찾아봤다

갓택오버플로우

TO-BE

private boolean checkDuplicationLecture(LocalDateTime startTime, LocalDateTime endTime) {

        QReservation reservation = QReservation.reservation;

        BooleanExpression startTimeOperation  = Expressions.booleanOperation(Ops.BETWEEN,
                Expressions.constant(startTime), reservation.startTime, reservation.endTime);

        BooleanExpression endTimeOperation = Expressions.booleanOperation(Ops.BETWEEN,
                Expressions.constant(endTime), reservation.startTime, reservation.endTime);

        Reservation findReservation =   queryFactory
                .selectFrom(reservation)
                .where(startTimeOperation.or(endTimeOperation))
                .fetchFirst();

        if (findReservation != null) return true;

        return false;
    }

포인트

BooleanExpression startTimeOperation  = Expressions.booleanOperation(Ops.BETWEEN,
      Expressions.constant(startTime), reservation.startTime, reservation.endTime);

BooleanExpression endTimeOperation = Expressions.booleanOperation(Ops.BETWEEN,
      Expressions.constant(endTime), reservation.startTime, reservation.endTime);

이런식으로 인자로 받은 값을 기준으로

? between col1 and col2 를 실행할 수 있다.

  • Query
select
        reservatio0_.id as id1_2_,
        reservatio0_.account_id as account_6_2_,
        reservatio0_.end_time as end_time2_2_,
        reservatio0_.lecture_id as lecture_7_2_,
        reservatio0_.start_time as start_ti3_2_,
        reservatio0_.status as status4_2_,
        reservatio0_.watcher as watcher5_2_ 
    from
        reservation reservatio0_ 
    where
        reservatio0_.account_id=? 
        and reservatio0_.lecture_id=? 
        and (
            ? between reservatio0_.start_time and reservatio0_.end_time 
            or ? between reservatio0_.start_time and reservatio0_.end_time
        ) limit ?

References

QueryDSL how to write "WHERE ? BETWEEN col1 AND col2"
[Querydsl] 다이나믹 쿼리 사용하기

'Dev > Spring Data' 카테고리의 다른 글

[Querydsl] 4. 예제용 도메인 생성  (0) 2021.01.19
[Querydsl] 3. JPA yml 설정  (0) 2021.01.19
[Querydsl] 2. H2 Database  (0) 2021.01.19
[Querydsl] 1. Querydsl 설정하기  (0) 2021.01.19
Querydsl 셋팅을 할 수 있다구요!  (0) 2020.08.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함