メソッドで指定されている場合、さまざまな条件付きパラメーターを取ることができる単純なクエリがあります。
String sql = "SELECT * FROM TABLE WHERE userId = ?";
ArrayList<Object> dataBindings = new ArrayList<Object>();
dataBindings.add(userId);
if(startDate != null && !startDate.equalsIgnoreCase("")){
SQL += " AND datev BETWEEN ? AND ?";
dataBindings.add(startDate);
dataBindings.add(endDate);
}
if (argn > 0) {
SQL += " AND argn = ?";
dataBindings.add(argn);
}
List<SomeObject> someObjectList = this.jdbcTemplate.query(SQL, new RowMapper<SomeObject>() {
// using anonymous inner class RowMapper here
public SomeObject mapRow(ResultSet rs, int rowNum) throws SQLException {
SomeObject o = new SomeObject();
o.setId(rs.getInt("idobj"));
...
return s;
}
}, dataBindings.toArray());
しかし、私はエラーが発生します:No operator matches the given name and argument type(s). You might need to add explicit type casts.
各引数の型を指定する必要がありますが、オブジェクトの配列を に渡すと、query()
どの引数が文字列か整数かを判断できません。
どうすればこれを達成できますか?
編集:私はこの方法を試しましたが、これらの条件を再度チェックしないと渡すパラメータのインデックスがわからないため、各条件を少なくとも2回チェックするため、よりエレガントになると思います
try {
InitialContext context = new InitialContext();
ComboPooledDataSource dataSource = (ComboPooledDataSource) context.lookup("jdbc/myDB");
PreparedStatement ps = dataSource.getConnection().prepareStatement(SQL);
ps.setLong(1, userId);
if(startDate != null && !startDate.equalsIgnoreCase("")) {
ps.setString(2, startDate);
ps.setString(3, endDate);
}
if (argn > 0) {
if(startDate != null && !startDate.equalsIgnoreCase("")) {
ps.setInt(3, argn);
} else {
ps.setInt(2, argn);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
ここでは RowMapper を使用できません
だから私はできる:
final String finalSqlQuery = SQL;
jdbcTemplate.query(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con)
throws SQLException {
PreparedStatement ps = con.prepareStatement(finalSqlQuery);
if(startDate != null && !startDate.equalsIgnoreCase("")) {
ps.setString(2, startDate);
ps.setString(3, endDate);
}
if (argn > 0) {
if(startDate != null && !startDate.equalsIgnoreCase("")) {
ps.setInt(3, argn);
} else {
ps.setInt(2, argn);
}
}
}
}, new RowMapper<SomeObject>() {
public SomeObject mapRow(ResultSet rs, int rowNum) throws SQLException {
SomeObject o = new SomeObject();
o.setId(rs.getInt("idobj"));
...
return s;
}
});
しかし、条件を再度チェックしてパラメータのインデックスを決定するのは本当に醜いようです