spring数据jpa不适用于java 8 LocalTime
Spring数据存储库(1.8版)的查询派生机制在Java8LocalTime中无法正常工作。有人能告诉我我做错了还是一个错误吗 我将开始时间存储在上午10:00spring数据jpa不适用于java 8 LocalTime,java,hibernate,java-8,spring-data,spring-data-jpa,Java,Hibernate,Java 8,Spring Data,Spring Data Jpa,Spring数据存储库(1.8版)的查询派生机制在Java8LocalTime中无法正常工作。有人能告诉我我做错了还是一个错误吗 我将开始时间存储在上午10:00 LocalTime startingTime = LocalTime.of(10,0); myEntity.setHorai(startingTime); myEntityRepository.save(myEntity); 然后我要求所有开始时间大于上午08:00的实体: LocalTime zeroEight = LocalT
LocalTime startingTime = LocalTime.of(10,0);
myEntity.setHorai(startingTime);
myEntityRepository.save(myEntity);
然后我要求所有开始时间大于上午08:00的实体:
LocalTime zeroEight = LocalTime.of(8, 0);
List<MyEntity> ents = myEntityRepository.findByStartingTimeAfter(zeroEight);
LocalTime zeroEight=LocalTime.of(8,0);
List ents=myEntityRepository.findbystatingtimeafter(零八);
我可以看到Hibernate(我使用的是Hibernate版本4.3.7.Final)执行以下操作:
Hibernate: select <all fields> from MyEntity m_ where m_.startingTime>?
TRACE 2015-03-27 12:08:51,283 o.h.type.descriptor.sql.BasicBinder: binding parameter [1] as [VARBINARY] - [08:00]
Hibernate:从MyEntity m_uUm.where m_Uu.startingTime>中选择?
TRACE 2015-03-27 12:08:51283 o.h.type.descriptor.sql.BasicBinder:绑定参数[1]为[VARBINARY]-[08:00]
因此,列表应该包含1个元素,但它有0个元素。
如果我使用findbystatingtimebefore
而不是findbystatingtimebefore
返回1个元素,但我不确定是否是因为我误解了前后的工作方式。我尝试了比更大的findbystatingtimer,但以同样的方式失败
也许查询派生机制不适用于Java8LocalTime
可能是Hibernate上的问题,即没有正确地比较VARBINARY数据(我可以看到LocalTime存储为BLOB,但它正确地存储和检索为LocalTime)
我正在使用postgres 9.2,但我认为问题不在postgres上。答案在问题中。Hibernate还不支持java.time类(它将在5.0版中提供)。因此,它将LocalTime视为可序列化实例,并将序列化的LocalTime实例作为字节数组存储在varbinary列中。因此,
运算符对这种类型的列没有多大意义,并且不会按时间顺序比较LocalTime值
您可以定义自己的自定义Hibernate类型,或使用(为您定义此自定义类型)将LocalTime值存储在适当的列类型中。如果没有进一步的映射信息,Hibernate将把JDK 8日期视为BLOB,因此无法再对这些字段应用任何比较操作
一种解决方案是使用自定义这些类型映射到数据库的方式
如果您只处理非时间分区类型(例如,LocalDate
,LocalDateTime
),最简单的方法是使用Spring数据JPA 1.8附带的JPA 2.1转换器。只需确保Jsr310JpaConverters
是持久类的列表(通过扫描相应的包或在persistence.xml
中手动列出该类)这些JDK8特定的日期/时间类型被透明地映射到date
,以便任何持久性提供者都可以立即持久化它们。有关这方面的更多信息,请参阅。我将等待Hibernate 5。谢谢,这不完全正确。SpringDataJPA1.8提供了JPA2.1转换器,允许您在当前可用的持久化提供程序上即时持久化这些类型。更多细节请参见我的答案。