java.sql.SQLException:ResultSet只能以正向访问

问题描述 投票:0回答:1

我有一个可以在MySQL数据库上顺利运行的程序。现在出于外部需求,我必须切换到SQL Server。多亏了Hibernate,除了错误以外,切换非常流畅:

java.sql.SQLException:ResultSet只能向前访问。

对从数据库中获取的数据执行自定义分页时,出现此错误。下面是一个最小的示例,尝试获取和分页存储在数据库中的用户(以下示例假定表中至少有3行)。

自定义分页:

import org.hibernate.Query;
import org.hibernate.Session;

public class newMain1 {

    public static void main(String[] args) {
        getList(1, getSession());
        getList(2, getSession());
    }

    private static void getList(int page, Session s) {
        int rowsPerPage = 2;
        String hql = "FROM User u ";

            try {
                Query query = s.createQuery(hql);
                int start = (page - 1) * rowsPerPage;
                query.setFirstResult(start);
                query.setMaxResults(rowsPerPage);
                //line that throws exception when int page is 2
                query.list();
                //line that throws exception when int page is 2
            } finally {
                if (s.isOpen()) {
                    s.close();
                }
            }
    }

    private Session getSession(){
        //gets org.hibernate.Session
    }
}

用户Java POJO:

public class User {    
    private Long id;
    private String username;
    private String password;
    private String email;

    public User() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

SQL Server用户表:

CREATE TABLE [USER] (
  ID bigint NOT NULL,
  USERNAME varchar(150) NOT NULL UNIQUE,
  PASSWORD varchar(150) NOT NULL,
  EMAIL varchar(150) NOT NULL UNIQUE,
  PRIMARY KEY (ID)
);

用户POJO的休眠映射:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="product.model.User" table="USER">
        <id column="ID" name="id" type="long">
            <generator class="increment"/>
        </id>
        <property column="EMAIL" name="email" type="string"/>
        <property column="USERNAME" name="username" type="string"/>
        <property column="PASSWORD" name="password" type="string"/>
    </class>
</hibernate-mapping>

Hibernate cfg xml:

<session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
    <property name="hibernate.connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=myDB;prepareSQL=3;sendStringParametersAsUnicode=false;</property>
    <property name="hibernate.connection.username">sa</property>
    <property name="hibernate.connection.password">myPassword</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.globally_quoted_identifiers">true</property>
    <mapping resource="product_mapping/user.hbm.xml"/>
  </session-factory>

我正在使用SQL Server 2012,JDK 1.8,Hibernate 4.0.1.Final,jtds驱动程序1.3.1

[请注意,getList(1, getSession())不会引发异常,而getList(2, getSession())会引发异常。

java sql-server hibernate jtds
1个回答
0
投票

经过数小时的调查,我发现此问题是由于我使用的休眠方言造成的。

考虑到我需要使用的休眠版本,正确的方言是:org.hibernate.dialect.SQLServer2008Dialect

来源:https://forum.hibernate.org/viewtopic.php?p=2452163

© www.soinside.com 2019 - 2024. All rights reserved.