Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
spring数据jpa不适用于java 8 LocalTime_Java_Hibernate_Java 8_Spring Data_Spring Data Jpa - Fatal编程技术网

spring数据jpa不适用于java 8 LocalTime

spring数据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

Spring数据存储库(1.8版)的查询派生机制在Java8LocalTime中无法正常工作。有人能告诉我我做错了还是一个错误吗

我将开始时间存储在上午10:00

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转换器,允许您在当前可用的持久化提供程序上即时持久化这些类型。更多细节请参见我的答案。