java - spring-data-jpa 不适用于 java 8 LocalTime

标签 java hibernate java-8 spring-data spring-data-jpa

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自定义这些类型映射到数据库的方式。

如果您只处理非时区类型(例如 LocalDateLocalDateTime),最简单的方法是使用 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/

相关文章:

Java JFrame 设置自定义不透明度

java - ConstraintViolationException : Validation failed for classes [. ...entities.WalletInfo] 在坚持期间

java - 为什么我不能在这段代码中以相反的顺序排序?

java - 如何进行 Hibernate XML 映射,一对多使用 1 PK 映射到具有复合键的另一个实体

java - 如何将 am-pm-of-day 格式化为 "AM/PM"而不是 "a.m./p.m."?

java - 如何使用 Java 8 流迭代引用父元素的嵌套循环?

java - Selenium Grid 将值并行发送到一个浏览器

java - HTTP 状态 500 - Servlet 执行抛出异常

java - Swig 类型映射 java 对象

java - JPA 继承 entitymanager.find 产生 ClassCastException