我正在使用带有 JPA 的 Hibernate 5。下面是一些代码片段。该对象是使用 JAXB 构建的,我不希望更改 Calendar 的响应类型,因为它也会影响其他应用程序。
class Object {
@XmlSchemaType(
name = "dateTime"
)
@Temporal(TemporalType.TIMESTAMP)
protected Calendar startDate;
}
执行的查询是
select count(m) from Message as m where start_date > :startDate
参数设置如下
query.setParameter("startDate", object.getStartDate(), TemporalType.TIMESTAMP);
但是,在执行调用查询的代码时,我得到以下堆栈跟踪。
Caused by: java.lang.ClassCastException: java.util.GregorianCalendar cannot be cast to java.util.Date
at org.hibernate.type.descriptor.java.JdbcTimestampTypeDescriptor.unwrap(JdbcTimestampTypeDescriptor.java:24)
at org.hibernate.type.descriptor.sql.TimestampTypeDescriptor$1.doBind(TimestampTypeDescriptor.java:48)
at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:73)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:276)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:271)
at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:53)
at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:648)
at org.hibernate.loader.Loader.bindPreparedStatement(Loader.java:2113)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:2090)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2022)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2000)
at org.hibernate.loader.Loader.doQuery(Loader.java:951)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:352)
at org.hibernate.loader.Loader.doList(Loader.java:2831)
at org.hibernate.loader.Loader.doList(Loader.java:2813)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2645)
at org.hibernate.loader.Loader.list(Loader.java:2640)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:506)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:400)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:219)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1412)
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1565)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1533)
at org.hibernate.query.Query.getResultList(Query.java:165)
注意它选择为对象类型 Date 硬编码的 JdbcTimestampTypeDescriptor,这可能是我的问题所在。
问题
- 我究竟做错了什么?
- 如何影响休眠选择 CalendarTypeDescriptor?如果是这样,那会是正确的方法吗?
更新我不想更改代码,因为这个类似的代码在多个地方/存储库中,我不想更新所有这些