jdbcTemplate.query (PreparedStatementCreator ps c, ResultSetExtractor <T>rse) не возвращает никакого набора результатов - PullRequest
0 голосов
/ 12 марта 2020

Я нахожусь в процессе преобразования создания подключения в класс JdbcTemplate, который обрабатывает создание и освобождение ресурсов. Одна из реализаций, показанных ниже, не возвращает мне набор результатов, хотя исходная для того же запроса возвращает мне записи. Я преобразовал приведенный ниже код

ps = connection.prepareStatement(strQuery, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ps.setLong(1, getId());
objRs = ps.executeQuery();

в код, показанный ниже. Я использовал StreamingStatementCreator по той причине, что мне нужно было установить ResultSet.TYPE_SCROLL_INSENSITIVE и ResultSet.CONCUR_READ_ONLY.

objRs = (ResultSet) jdbcTemplate.query(new StreamingStatementCreator(strQuery),
        new PreparedStatementSetter() {
            public void setValues(PreparedStatement preparedStatement) throws SQLException {
                preparedStatement.setLong(1, getId());
            }
        }, new CustomResultSetExtractor());
public class CustomResultSetExtractor implements ResultSetExtractor<ResultSet>{
    public ResultSet extractData(ResultSet resultSet) throws SQLException, DataAccessException {
        return resultSet;
    }
}

Я не знаком с этими методами. Я попытался найти примеры, и я чувствую, что код правильный, возможно, я что-то упустил. Первый случай возвращает мне значение в objRs, а второй ничего не возвращает.

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Метод query(PreparedStatementCreator psc, ResultSetExtractor<T> rse) Не возвращает ResultSet. Он вызывает второй параметр с ResultSet в качестве аргумента и возвращает объект, который был возвращен им.

Таким образом, вы должны обработать ResultSet в CustomResultSetExtractor и вернуть другой объект в результате обработки.

0 голосов
/ 17 марта 2020

Основываясь на подсказке Александра, использовал ColumnMapRowMapper для итерации набора результатов. Так как я хотел универсальное c решение, которое я мог бы использовать для всех своих запросов, вместо обработки результирующего набора в моем CustomResultSetExtractor или создания отдельных классов. Я добавляю код сюда, чтобы любой, кто сталкивался с такой же ситуацией, мог найти его полезным.

public class CustomResultSetExtractor implements ResultSetExtractor<Object>{

    private RowMapper<Map<String, Object>> mapper;

    public CustomResultSetExtractor(ColumnMapRowMapper mapper) {
       this.mapper = mapper;
    }

    public List<Map<String, Object>> extractData(ResultSet rs) throws SQLException, DataAccessException {
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        int row = 0;
        while(rs.next()){  
            Map<String, Object> o = (Map<String, Object>)mapper.mapRow(rs, row++);
            list.add(o);
        }
        return list;
    }
}
...