【问题标题】:Hibernate sql exception when table empty表空时休眠sql异常
【发布时间】:2011-04-11 12:57:51
【问题描述】:

当 Job 表没有行时,以下代码会导致异常。

public List<Job> getAll(int currentPage, int pageSize) {
    return this.sessionFactory.getCurrentSession()
        .createCriteria(Job.class).addOrder(Order.asc("id"))
        .setFirstResult(currentPage * pageSize).setMaxResults(pageSize)
        .setFetchSize(pageSize).list();
}

我正在使用 SQL Server 和 JTDS 驱动程序。

我得到的错误是

java.sql.SQLException: ResultSet may only be accessed in a forward direction.
 net.sourceforge.jtds.jdbc.JtdsResultSet.checkScrollable(JtdsResultSet.java:319)
 net.sourceforge.jtds.jdbc.JtdsResultSet.absolute(JtdsResultSet.java:716)
 org.apache.commons.dbcp.DelegatingResultSet.absolute(DelegatingResultSet.java:335)
 org.hibernate.loader.Loader.advance(Loader.java:1469)
 org.hibernate.loader.Loader.getResultSet(Loader.java:1783)
 org.hibernate.loader.Loader.doQuery(Loader.java:662)
 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
 org.hibernate.loader.Loader.doList(Loader.java:2211)
 org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2095)
 org.hibernate.loader.Loader.list(Loader.java:2090)
 org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:95)
 org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569)
 org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)

【问题讨论】:

  • 关于如何避免这种情况的任何想法?

标签: sql-server hibernate jtds


【解决方案1】:

我也遇到了同样的问题,看了一会后,一位同事建议我改变休眠方言:

org.hibernate.dialect.SQLServerDialect

到这里

org.hibernate.dialect.SQLServer2005Dialect

它解决了我的问题。

发布只是为了让人们检查他们的方言。

【讨论】:

    【解决方案2】:

    将以下属性添加到 persistence.xml 为我解决了这个问题(jboss7,hibernate4)

    <property name="hibernate.jdbc.use_scrollable_resultset" value="false" />
    

    改变方言的替代解决方案(我没有检查)-https://forum.hibernate.org/viewtopic.php?p=2452163

    【讨论】:

    • 在 SQL Server 2000 和 JTDS 1.2.7 上使用 setFirstResult() 时为我解决了正向问题,谢谢!
    【解决方案3】:

    该问题与尝试分页空表有关。 放下这些:
    .setFirstResult(currentPage * pageSize).setMaxResults(pageSize)
    .setFetchSize(pageSize)
    并且您应该能够毫无问题地查询空表。 如果要对数据进行分页,请先运行常规查询,然后在知道有要分页的数据后使用查询对数据进行分页。

    【讨论】:

    • 在使用 MySQL 时效果很好。它似乎只在 SQL Server 上失败。
    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 2011-02-14
    • 2018-12-07
    • 2014-06-16
    • 2015-06-03
    • 2016-02-05
    • 2016-10-08
    • 2014-08-22
    相关资源
    最近更新 更多