프로젝트 스펙은 아래와 같습니다.
- hibernate-core 5.0.12
- hibernate-jpa-2.1-api 1.0.0 Final
- java 1.8
날짜 컬럼을 이용하여 Between 쿼리를 수행하려고 합니다.
findBy[날짜필드]Between(LocalDateTime startDate, LocalDateTime endDate)
이 메서드를 수행하면 LocalDateTime이 아래와 같이 파라미터 바인딩되어 정상적으로 데이터를 가져오지 못합니다.
between '<byte[]>' and '<byte[]>'
LocalDateTime을 byte[]로 인식을 합니다.
java.time.LocalDateTime을 java.util.Date 으로 타입을 변경하면 정상적으로 메서드가 수행됩니다.
왜 이런 상황이 발생한 걸까요?
hibernate 5.0 공식 문서를 보면 아래와 같은 언급이 있습니다.
Hibernate allows various Java Date/Time classes to be mapped as persistent domain model entity properties. The SQL standard defines three Date/Time types:
DATE
Represents a calendar date by storing years, months and days. The JDBC equivalent is java.sql.Date
TIME
Represents the time of a day and it stores hours, minutes and seconds. The JDBC equivalent is java.sql.Time
TIMESTAMP
It stores both a DATE and a TIME plus nanoseconds. The JDBC equivalent is java.sql.Timestamp
기본적으로 hibernate에서 엔티티 프로퍼티에 사용 가능한 Date/Time 관련 클래스는 java.sql.Date, java.sql.Time, java.sql.Timestamp 세가지 입니다.
java.time 패키지를 프로퍼티로 사용하려면 아래의 내용대로 해야 합니다.
Java 8 came with a new Date/Time API, offering support for instant dates, intervals, local and zoned Date/Time immutable instances, bundled in the java.time package. Hibernate added support for the new Date/Time API in a new module, which must be included with the following Maven dependency:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>${hibernate.version}</version>
</dependency>
정리하면 java 8의 java.time 패키지를 Hibernate에서 사용하려면 'hibernate-java8' 라이브러리를 추가하라는 이야기입니다.
위의 절차대로 진행하고 다시 실행하면 정상적으로 날짜 문자열이 바인딩 되는 것을 확인할 수 있습니다.
between '2024-06-03 16:00:16' and '2024-07-03 16:00:16'
'[개발] 프레임워크 > Spring' 카테고리의 다른 글
ehcache (0) | 2024.07.26 |
---|---|
[JPA] 트랜잭션을 지원하는 쓰기 지연은 락을 몇 초 잡을까? (1) | 2024.07.14 |
Spring AOP (1) | 2024.06.26 |
Spring MVC (0) | 2024.06.23 |
트랜잭션 동일성 비교하기 (0) | 2024.02.08 |