java.time.LocalDate 最新的 Spring Data/Hibernate 本机查询不支持?

java.time.LocalDate not supported in native queries by latest Spring Data/Hibernate?

问题:本机查询 Spring 数据 returning 日期 return java.sql.Date 而不是 java.time.LocalDate,尽管设置。

上下文:新项目 Spring Boot 2.0.0.M5(最新)、Hibernate 5.2.11、Hibernate-Java8 5.2.12(支持 JSR310 类 只要它在类路径上)。

下面的匿名示例(该应用与生日无关):

public interface BirthdayRepository<T, ID extends Serializable> extends Repository<T, ID> {
    @Query(value = "select day from birthdays", nativeQuery = true)
    Iterable<java.sql.Date> getBirthdays(); //the return type should ideally be java.time.LocalDate
}

在数据库(SQL 服务器)中,日期字段是 DATE,值类似于 2017-10-24。

问题是在运行时,Spring 数据存储库(我无法控制其实现,或者有办法吗?)returns java.sql.Date 而不是 java.time.LocalDate(澄清:return 类型似乎由 Spring 数据决定并且保持 java.sql.Date 甚至如果我将 return 类型更改为 java.time.LocalDate,我就是这样开始的)。

没有办法直接获取LocalDate吗?我可以稍后转换它,但是(1)效率低下(2)存储库方法有return 旧的 date/time 类,这是我想避免的。我阅读了 Spring 数据 documentation,但没有关于此的内容。

编辑:对于有同样问题的任何人,下面是解决方案,Jens 建议的转换器。

public class LocalDateTypeConverter {

    @Converter(autoApply = true)
    public static class LocalDateConverter implements AttributeConverter<LocalDate, Date> {

        @Nullable
        @Override
        public Date convertToDatabaseColumn(LocalDate date) {
            return date == null ? null : new Date(LocalDateToDateConverter.INSTANCE.convert(date).getTime());
        }

        @Nullable
        @Override
        public LocalDate convertToEntityAttribute(Date date) {
            return date == null ? null : DateToLocalDateConverter.INSTANCE.convert(date);
        }
    }

您似乎在转换器中发现了一个缺口。 Spring 数据在 java.util.Datejava.time.LocalDate 之间直接转换,但在 java.time.LocalDatejava.sql.Date 以及 [=14 中的其他日期和时间相关类型之间不转换=]包。

您可以创建自己的转换器来执行此操作。您可以使用 Jsr310JpaConverters 作为模板。

另外,您可能想要创建一个功能请求,如果您构建一个转换器供您使用,您甚至可以提交一个拉取请求。

我知道这是一个较旧的问题,但我对这个问题的解决方案不需要自定义转换器。

    public interface BirthdayRepository<T, ID extends Serializable> extends Repository<T, ID> {
      @Query(value = "select cast(day as date) from birthdays", nativeQuery = true)
      Iterable<java.time.LocalDate> getBirthdays();
    }

CAST 告诉 JPQL 使用可用的 java date\time 类型而不是 java.sql.Date