休眠选择不正确的TypeDescriptor

问题描述

我正在将Hibernate 5与JPA一起使用。以下是一些代码片段。 该对象是使用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)

注意:它选择JdbcTimestampTypeDescriptor,该对象为对象类型Date硬编码,这可能是我的问题所在。

问题

  • 我在做什么错了?
  • 如何影响休眠状态以选择CalendarTypeDescriptor?如果是的话,那是正确的方法吗?

更新,我不想更改代码,因为该相似代码位于多个位置/存储库中,并且我不想更新所有这些代码/

解决方法

您可以使用getTime()方法将日历对象转换为日期:

query.setParameter("startDate",object.getStartDate().getTime(),TemporalType.TIMESTAMP);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...