Spring Data存储库(版本1.8)的查询派生机制无法与Java 8 LocalTime正常工作。有人可以告诉我我做错了吗还是一个错误?
我将开始时间存储在上午 10:00
LocalTime startingTime = LocalTime.of(10,0);
myEntity.setHorai(startingTime);
myEntityRepository.save(myEntity);
然后我询问开始时间大于 08:00 am 的所有实体:
LocalTime zeroEight = LocalTime.of(8, 0);
List<MyEntity> ents = myEntityRepository.findByStartingTimeAfter(zeroEight);
我可以看到 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]
所以 List 应包含 1 个元素,但它有 0 个元素。
如果我使用 findByStartingTimeBefore
而不是 findByStartingTimeAfter
,它会返回 1 个元素,但我不确定这是否是因为我误解了 Before 和 After 的工作方式。我尝试过 findByStartingTimeGreaterThan
但以同样的方式失败。
也许查询派生机制不适用于 Java 8 LocalTime?
也许是 Hibernate 上的问题,即没有正确比较 VARBINARY 数据(我可以看到 LocalTime 存储为 BLOB,但它正确存储和检索为 LocalTime)?
我使用的是 postgres 9.2,但我不认为问题出在 postgres 上。
最佳答案
如果没有进一步的映射信息,Hibernate 会将 JDK 8 日期视为 BLOB,因此无法再对这些字段应用任何比较操作。
解决此问题的一种方法是使用 Jadira User Types library自定义这些类型映射到数据库的方式。
如果您只处理非时区类型(例如 LocalDate
、LocalDateTime
),最简单的方法是使用 Spring Data 附带的 JPA 2.1 转换器JPA 1.8。只需确保 Jsr310JpaConverters
是持久类的列表(通过扫描相应的包或在 persistence.xml
中手动列出该类)以及这些 JDK 8 特定日期/时间类型被透明地映射到Date
,以便任何持久性提供者可以立即持久化它们。在 blog post announcing new features in the Spring Data Fowler release train 中查找更多相关信息.
关于java - spring-data-jpa 不适用于 java 8 LocalTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29299573/