нельзя использовать resultSet.setFetchDirection (ResultSet.TYPE_SCROLL_SENSITIVE) с пружиной jdbc DaoSupport с Oracle - PullRequest
1 голос
/ 15 января 2010

Я хочу использовать прокручиваемый набор результатов, поэтому, когда я использую две строки кода:

 rs.setFetchDirection(ResultSet.TYPE_SCROLL_SENSITIVE);
rs.absolute(12);

в моем DAOimpl, я получаю исключение, плз, помогите решить их, заранее спасибо.

 import oracle.jdbc.OracleTypes;
    import org.springframework.jdbc.core.CallableStatementCallback;
    import org.springframework.jdbc.core.support.JdbcDaoSupport;
    import org.springframework.stereotype.Component;
    @Component
    public class MyDAOimpl extends JdbcDaoSupport implements
            MyDAO {

        public List<User> getList(final String where) throws Exception {

            return (List) getJdbcTemplate().execute(
                    "{call PKG_USER.getUser(?,?)}",
                    new CallableStatementCallback() {
                        public Object doInCallableStatement(CallableStatement cs)
                                throws SQLException {

                            cs.setString(1, where);
                            cs.registerOutParameter(2, OracleTypes.CURSOR);
                            cs.execute();

                            ResultSet rs = (ResultSet) cs.getObject(6);

                            rs.setFetchDirection(ResultSet.TYPE_SCROLL_SENSITIVE);
                            rs.absolute(12);

                            List<User> list = new ArrayList<User>();

                            while (rs.next()) {

                                User user = new User(
                                        rs.getString(1),
                                        rs.getString(2), 
                                        rs.getString(3));
                                list.add(user);
                            }
                            return list;
                        }
                    });

        }
    }

это исключение

java.sql.SQLException: Invalid argument(s) in call: setFetchDirection
    oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
    oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
    oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
    oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
    oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
    oracle.jdbc.driver.BaseResultSet.setFetchDirection(BaseResultSet.java:128)

/////////////////////////////////////////////// ///////////////////////////////////////////

, где я меняю, как показано ниже, я не получил никакого результата, обычно моя процедура возвращает 100 пользователей:

return (List) getJdbcTemplate().execute(new CallableStatementCreator() {

            public CallableStatement createCallableStatement(
                    Connection connection) throws SQLException {
                return connection.prepareCall(
                        "{call PKG_USER.getUser(?,?)}",
                        ResultSet.TYPE_SCROLL_SENSITIVE,
                        ResultSet.TYPE_SCROLL_INSENSITIVE);
            }
        }, new CallableStatementCallback() {

            public Object doInCallableStatement(CallableStatement cs)
                    throws SQLException, DataAccessException {

                cs.setString(1, where);
                cs.registerOutParameter(2, OracleTypes.CURSOR);
                cs.execute();

                ResultSet rs = (ResultSet) cs.getObject(6);

                //////not run////
                rs.absolute(12);
                ////////////////

                List<User> list = new ArrayList<User>();

                while (rs.next()) 
                {   
                    List<User> list = new ArrayList<User>();

                            while (rs.next()) {

                                User user = new User(
                                        rs.getString(1),
                                        rs.getString(2), 
                                        rs.getString(3));
                                list.add(user);
                            }
                            return list;
            }
        });

1 Ответ

6 голосов
/ 15 января 2010

Во-первых, ResultSet.TYPE_SCROLL_SENSITIVE является константой, указывающей тип набора результатов и, безусловно, не является допустимым аргументом для setFetchDirection, который ожидает прямое направление . Цитирование раздела параметров javadoc: ResultSet#setFetchDirection(int direction):

direction - int с указанием предполагаемого направления выборки; один из ResultSet.FETCH_FORWARD, ResultSet.FETCH_REVERSE или ResultSet.FETCH_UNKNOWN

Отсюда исключение и сообщение «Недопустимый аргумент (ы) в вызове: setFetchDirection».

И, кстати, согласно Oracle Руководство разработчика JDBC и справочник (все версии доступны с http://tahiti.oracle.com/) в Обработка прокручиваемого результирующего набора :

Предварительная настройка направления выборки

Стандарт JDBC 2.0 позволяет возможность предварительно указать направление, известный как направление выборки, для использования в обработке результирующего набора. это позволяет драйверу JDBC оптимизировать его обработка. Следующий набор результатов указаны методы:

  • void setFetchDirection(int direction) throws SQLException * int getFetchDirection() throws SQLException

Драйверы Oracle JDBC поддерживают только предустановленное значение , которое вы можно указать, введя ResultSet.FETCH_FORWARD статический постоянное значение.

Значения ResultSet.FETCH_REVERSE и ResultSet.FETCH_UNKNOWN не поддерживается. Попытка указать их вызывает предупреждение SQL, и настройки игнорируются.

Это также упоминается в readme Драйверов JDBC Oracle Database 11g Release 2 (окончательная версия на момент написания этой статьи):

прокручиваемый набор результатов реализация имеет следующее ограничение:

  • setFetchDirection () для ScrollableResultSet не выполняет ничего.

Но все это было своего рода примечанием, использование setFetchDiretion просто не способ получить прокручиваемый набор результатов. * * 1068

Чтобы создать прокручиваемый набор результатов с помощью JdbcTemplate Spring, вы должны использовать метод execute(CallableStatementCreator csc, CallableStatementCallback action) с пользовательской реализацией CallableStatementCreator. В этой реализации используйте метод Connection.prepareCall(String sql, int resultSetType, int resultSetConcurrency) для создания CallableStatement, который будет производить ResultSet объекты с заданным типом и параллелизмом. Наконец, позвоните rs.absolute().


ОБНОВЛЕНИЕ: Проблема в вызове connection.prepareCall(), третий параметр должен иметь тип параллелизма (ResultSet.CONCUR_READ_ONLY или ResultSet.CONCUR_UPDATABLE). Попробуйте это:

            return connection.prepareCall(
                    "{call PKG_USER.getUser(?,?)}",
                    ResultSet.TYPE_SCROLL_SENSITIVE,
                    ResultSet.CONCUR_UPDATABLE);
...