首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate选择错误的TypeDescriptor

Hibernate选择错误的TypeDescriptor
EN

Stack Overflow用户
提问于 2020-10-07 06:54:27
回答 1查看 252关注 0票数 2

我在JPA中使用Hibernate 5。下面是一些代码片段。该对象是使用JAXB构建的,我不喜欢从Calendar中更改响应类型,因为它也会影响其他应用程序。

代码语言:javascript
复制
class Object {
    @XmlSchemaType(
        name = "dateTime"
    )
    @Temporal(TemporalType.TIMESTAMP)
    protected Calendar startDate;
}

执行的查询是

代码语言:javascript
复制
select count(m) from Message as m where start_date > :startDate

参数设置如下

代码语言:javascript
复制
query.setParameter("startDate", object.getStartDate(), TemporalType.TIMESTAMP);

但是,在执行调用查询的代码时,我会得到以下堆栈跟踪。

代码语言:javascript
复制
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,这可能是我的问题所在。

问题

  • 我做错了什么?
  • 如何影响hibernate选择CalendarTypeDescriptor?如果是这样的话,这是正确的方法吗?

update 我不想更改代码,因为类似的代码位于多个地方/存储库中,我不想全部更新

EN

回答 1

Stack Overflow用户

发布于 2020-10-07 08:37:54

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

代码语言:javascript
复制
query.setParameter("startDate", object.getStartDate().getTime(), TemporalType.TIMESTAMP);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64238761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档