40

私はSpringを使用しJdbcTemplateており、次のようなクエリを実行しています:

SELECT COLNAME FROM TABLEA GROUP BY COLNAME

渡される名前付きパラメーターはありませんが、列名COLNAMEはユーザーによって渡されます。

質問

  1. ?列名のように、プレースホルダーを持つ方法はありますか? 例えばSELECT ? FROM TABLEA GROUP BY ?

  2. 上記のクエリを単純に実行して取得したい場合List<String>、最善の方法は何ですか?

現在、私はやっています:

List<Map<String, Object>> data = getJdbcTemplate().queryForList(query);
for (Map m : data) {
  System.out.println(m.get("COLNAME"));
}
4

4 に答える 4

102

文字列のリストを設定するために、カスタム行マッパーを使用する必要はありません。を使用して実装しqueryForListます。

List<String>data=jdbcTemplate.queryForList(query,String.class)
于 2016-11-04T07:25:12.027 に答える
21

のようなプレースホルダーを持つ方法はありますか? 列名の?たとえば、SELECT ? テーブルから GROUP BY ?

以下のように動的クエリを使用します。

String queryString = "SELECT "+ colName+ " FROM TABLEA GROUP BY "+ colName;

上記のクエリを単純に実行してリストを取得したい場合、最善の方法は何ですか?

List<String> data = getJdbcTemplate().query(query, new RowMapper<String>(){
                            public String mapRow(ResultSet rs, int rowNum) 
                                                         throws SQLException {
                                    return rs.getString(1);
                            }
                       });

編集: SQL インジェクションを停止するには、colName の単語以外の文字を次のように確認します。

          Pattern pattern = Pattern.compile("\\W");
          if(pattern.matcher(str).find()){
               //throw exception as invalid column name
          }
于 2012-11-13T01:16:04.717 に答える