티스토리 뷰
Variable Between Col1 and Col2 in Querydsl (BooleanExpression)
Querydsl 사용시 기준을 컬럼이 아닌 원하는 변수로 잡고 하는 방법
특정 시간대에 중복이 안되도록 하는 기능을 만드는 도중
startTime
과 endTime
을 인자로 받는 메소드를 만들었다.
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
링크
TAG
- QueryDSL
- Spring
- 스프링시큐리티
- java11
- springsecurity
- @formula
- paawordencoder
- mapstruct
- boot
- 자바
- API
- Java
- ubuntu
- 스프링
- springboot
- ControllerAdvice
- booleanExpression
- FastAPI
- Python
- Security
- 스프링부트 시작하기
- 개발
- like절
- spring web
- 웹서비스
- 스프링부트
- howtoinstallnginx
- 유사결과
- ResourceHttpReqeustHandler
- JPA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함