JPA 2.1:Java 8 Date / Time API简介
我想在启用了JPA的应用程序中添加对 Java 8 Date / Time API(JSR-310)的支持. 很明显,JPA 2.1 does not support the Java 8 Date/Time API. 在我现有的应用程序中,我将实体更改为使用LocalDate / LocalDateTime类型作为列映射字段,并将java.util.Date的旧的setter / getter添加到它们. 当使用Query.setParameter()与java.util.Date实例(它在转换到新的API之前工作)时,我的应用程序现在失败.似乎JPA期望新的日期类型,并且不会即时转换它. java.lang.IllegalArgumentException: You have attempted to set a value of type class java.util.Date for parameter closeDate with expected type of class java.time.LocalDate from query string SELECT obj FROM [...] at org.eclipse.persistence.internal.jpa.QueryImpl.setParameterInternal(QueryImpl.java:937) ~[eclipselink-2.6.2.jar:2.6.2.v20151217-774c696] at org.eclipse.persistence.internal.jpa.EJBQueryImpl.setParameter(EJBQueryImpl.java:593) ~[eclipselink-2.6.2.jar:2.6.2.v20151217-774c696] at org.eclipse.persistence.internal.jpa.EJBQueryImpl.setParameter(EJBQueryImpl.java:1) ~[eclipselink-2.6.2.jar:2.6.2.v20151217-774c696] [...] 问题: 这个行为是否预期?我错过了什么? 更新: Caused by: java.sql.SQLException: Invalid column type at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:10495) at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:9974) at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:10799) at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:10776) at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:241) at org.eclipse.persistence.internal.databaseaccess.DatabasePlatform.setParameterValueInDatabaseCall(DatabasePlatform.java:2506) 我希望EclipseLink使用AttributeConverter将字段类型转换为java.sql类型. 这导致我们最重要的问题#4: >有没有解决方法/解决方案来支持使用EclipseLink的java 8日期字段,包括在这样一个字段上使用查询参数的可能性? 附加信息 > AttributeConverter used (for LocalDateTime conversion) 解决方法前段时间,我将Java EE 7 Web应用程序从Java 7转换为Java 8,并在LocalDate和LocalDateTime的实体中替换了java.util.Date.>是的,这个行为是预期的,因为AttributeConverter只能在用于实体字段的类型和数据库类型(即java.sql.Date等)之间进行转换;它不会在查询参数中使用的实体字段类型和java.util.Date之间进行转换. 对于项目2,当然可以通过使用在java.util和java.time之间转换的实用程序方法和getter / setter来进行某种改变,但是不会一直发生.更重要的是,如果您不愿意转换剩余的使用这些代码的代码,我不太明白将java.time类型引入到JPA实体属性中属性.在Java EE应用程序进行转换后,没有使用任何java.util.Date(尽管我也必须为JSF创建转换器). (编辑:甘南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |