【问题标题】:MySQL query with DATE() function on LocalDateTime field在 LocalDateTime 字段上使用 DATE() 函数的 MySQL 查询
【发布时间】:2018-09-30 20:16:50
【问题描述】:

我有一个这样的查询:

@Query("SELECT rhwp.pk.reservation FROM ReservationHasWorkingPlace rhwp WHERE rhwp.pk.workingPlace.idWorkingPlace = ?1 AND NOT (DATE(rhwp.pk.reservation.endDateTime) < ?2 OR DATE(rhwp.pk.reservation.startDateTime) > ?3)")
List<Reservation> getReservationsForWPAndDateInterval(Integer idWorkingPlace, LocalDate startDate, LocalDate endDate);

我将存储到数据库中的 DateTime 与通过 java 方法传递的 localDate 进行比较。 我收到此异常:

Caused by: java.lang.IllegalArgumentException: Parameter value [2018-04-20] did not match expected type [java.util.Date (n/a)]

有一种方法可以配置 hibernate/jpa 以自动进行这种转换,或者我必须传递一个 Date 对象而不是 LocalDate? 我什至尝试过导入 hibernate-java8 但没有改变

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>${hibernate.version}</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-java8</artifactId>
    <version>${hibernate.version}</version>
</dependency>

【问题讨论】:

    标签: mysql sql spring hibernate jpa


    【解决方案1】:

    您可以简单地使用@Converter。将 LocalDateTime 转换为时间戳的示例:

    @Converter
    public class SomeConverterName implements AttributeConverter<LocalDateTime, Timestamp> {
    
        @Override
        public Timestamp convertToDatabaseColumn(final LocalDateTime locDateTime) {
            return Timestamp.valueOf(locDateTime);
        }
    
        @Override
        public LocalDateTime convertToEntityAttribute(final Timestamp sqlTimestamp) {
            return sqlTimestamp.toLocalDateTime();
        }
    }
    

    然后在实体字段上使用:

    @Column(name = "somefield")
    @Convert(converter = SomeConverterName.class)
    private LocalDateTime someDate;
    

    【讨论】:

    • 在数据库上我不需要转换器来存储数据,到LocalDateTime到DateTiem的映射是自动的,问题是使用DATE()函数
    • 嗯,没错。我认为因为 DATE 是一个数据库函数,它只能用于本机查询。尝试将查询重写为 native 并在 @Query 注释中添加 nativeQuery = true 以仔细检查。
    • 我认为 DATE 返回一个与 LocalDate 不同的对象,因此抛出异常。如果函数不能与 @Query 一起使用,则在部署期间出现错误
    • 使用 java.sql.Date.valueOf(start) 进行转换工作
    【解决方案2】:

    使用 java.sql.Date.valueOf(start) 进行转换工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 2016-11-26
      相关资源
      最近更新 更多