6

jdbctemplateクエリメソッドの1つから結果セットオブジェクトを取得する方法はありますか?

私は次のようなコードを持っています

List<ResultSet> rsList = template.query(finalQuery, new RowMapper<ResultSet>() {
        public ResultSet mapRow(ResultSet rs, int rowNum) throws SQLException {
            return rs;
        }
        }
        );

finalQuery Stringに格納されているSQLステートメントを実行して、結果セットを取得したかったのです。クエリは6〜7個のテーブルでの複雑な結合であり、各テーブルから4〜5個の列を選択し、それらの列のメタデータを取得してデータ型とデータをダウンストリームシステムに変換したいと考えています。

単純なクエリで、1つのテーブルのみをフェッチしている場合は、RowMapper#mapRowを使用でき、そのmaprowメソッド内でResultsetExtractor.extractDataを呼び出して結果のリストを取得できます。しかし、この場合、クエリに複雑な結合があり、結果セットオブジェクトとその結果セットメタデータを取得しようとしています...

上記のコードは、結果ごとに同じ結果セットオブジェクトを返し、リストに保存したくないため、適切ではありません...

もう一度、クエリの結果ごとにmaprowが呼び出された場合、リストにRSオブジェクトへの参照がある場合でも、JDBCTemplateはrsと接続を閉じますか?

jdbcTemplate.queryForResultSet(sql)のような簡単なメソッドはありますか?

これで、独自のResultSet Extractorを実装して、データを処理してダウンストリームシステムに挿入しました。

sourceJdbcTemplate.query(finalQuery, new CustomResultSetProcessor(targetTable, targetJdbcTemplate));

このCustomResultSetProcessorはResultSetExtractorを実装し、extractDataメソッドで3つの異なるメソッドを呼び出しています。1つはrs.getMetaData()からのget ColumnTypesで、もう1つは実行によるターゲットメタデータのgetColumnTypesです。

SELECT NAME, COLTYPE, TBNAME FROM SYSIBM.SYSCOLUMNS WHERE TBNAME ='TABLENAME' AND TABCREATOR='TABLE CREATOR'

3番目のメソッドでは、挿入ステートメント(準備済み)フォームのターゲット列タイプを作成し、最後にそれを使用して呼び出します

new BatchPreparedStatementSetter()
    {
        @Override
        public void setValues(PreparedStatement insertStmt, int i) throws SQLException{} }

これが他の人に役立つことを願っています...

4

3 に答える 3

6

Note that the whole point of Spring JDBC Template is that it automatically closes all resources, including ResultSet, after execution of callback method. Therefore it would be better to extract necessary data inside a callback method and allow Spring to close the ResultSet after it.

If result of data extraction is not a List, you can use ResultSetExtractor instead of RowMapper:

SomeComplexResult r = template.query(finalQuery, 
    new ResultSetExtractor<SomeComplexResult>() {
        public SomeResult extractData(ResultSet) {
            // do complex processing of ResultSet and return its result as SomeComplexResult
        }
    });
于 2011-03-15T15:46:25.203 に答える
3

次のようなものも機能します。

Connection con = DataSourceUtils.getConnection(dataSource); // your datasource
Statement s = con.createStatement();

ResultSet rs = s.executeQuery(query); // your query
ResultSetMetaData rsmd = rs.getMetaData();
于 2012-09-28T15:51:56.463 に答える