【问题标题】:After upgrading Oracle JDBC driver, a Hibernate criteria query throws exception升级 Oracle JDBC 驱动程序后,Hibernate 条件查询引发异常
【发布时间】:2013-01-12 22:10:20
【问题描述】:

我最近将 Oracle 11g 的 JDBC 驱动程序从 ojdbc14.jar 升级到了 ojdbc6.jar。 但是,以下条件查询现在不再起作用:

criteria = ...
criteria = criteria.createAlias("contract", "contract")
    .add(Restrictions.disjunction()
    .add(Restrictions.isNull("contract.dateend"))
    .add(Restrictions.gt("contract.dateend", new Date())));

将结果限制为与仍在运行的合同相关联的实体。

出现以下异常:

...
Caused by: org.hibernate.exception.GenericJDBCException: could not execute query
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.loader.Loader.doList(Loader.java:2536)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
    at org.hibernate.loader.Loader.list(Loader.java:2271)
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1716)
    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
    at org.hibernate.impl.CriteriaImpl.uniqueResult(CriteriaImpl.java:369)
    at <<my method which creates the criteria query>>
    ... 61 more
Caused by: java.sql.SQLException: year out of range.
    at oracle.jdbc.driver.DateCommonBinder.setOracleCYMD(OraclePreparedStatement.java:19241)
    at oracle.jdbc.driver.TimestampBinder.bind(OraclePreparedStatement.java:19520)
    at oracle.jdbc.driver.OraclePreparedStatement.setupBindBuffers(OraclePreparedStatement.java:3137)
    at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:2355)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3579)
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1953)
    at org.hibernate.loader.Loader.doQuery(Loader.java:802)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
    at org.hibernate.loader.Loader.doList(Loader.java:2533)
    ... 101 more

如前所述,它仍然适用于旧驱动程序。对应的数据库列的类型为DATE,应该被映射 通过休眠到java.util.Date 通过:

<property name="dateend">
    <column name="DATEEND" length="7" />
</property>

我是否必须更改此列的 Hibernate 映射?

提前致谢, 雷纳。

【问题讨论】:

    标签: hibernate jdbc oracle11g


    【解决方案1】:

    找到此行为的原因。类路径上有两个版本的 JDBC 驱动程序。我只更新了 Tomcat lib 文件夹中的 lib。但是,我的war 存档中仍然有一个旧版本。这导致了错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-05
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 2015-04-07
      • 2015-06-02
      • 1970-01-01
      • 2018-12-07
      相关资源
      最近更新 更多