web-dev-qa-db-ja.com

jdbctemplateでlist <String>を照会する方法

私はsprings 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"));
23
birdy

のようなプレースホルダーを持つ方法はありますか?列名にたとえば、SELECT? FROM TABLEA 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で次のように非Word文字を確認します。

          Pattern pattern = Pattern.compile("\\W");
          if(pattern.matcher(str).find()){
               //throw exception as invalid column name
          }
12
Yogendra Singh

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

List<String>data=jdbcTemplate.queryForList(query,String.class)
61
Ashwinie

次のコードを使用

List data = getJdbcTemplate().queryForList(query,String.class)

9
Amit Sargar

列名、テーブル名、データ型名、または基本的にデータではないものにプレースホルダーを使用することはできません。

1
Jayamohan