0

メソッドで指定されている場合、さまざまな条件付きパラメーターを取ることができる単純なクエリがあります。

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;
           }
    });

しかし、条件を再度チェックしてパラメータのインデックスを決定するのは本当に醜いようです

4

0 に答える 0