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.Date
和 java.time.LocalDate
之间直接转换,但在 java.time.LocalDate
和 java.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
问题:本机查询 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.Date
和 java.time.LocalDate
之间直接转换,但在 java.time.LocalDate
和 java.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