我正在使用spring JDBCTemplate。
我有一个场景,其中需要传递到我的查询函数中的参数是有条件的/可选的。例如,我有以下代码:
List<RealTimeDTO> result = jdbcTemplate.query(sql, new Object[] {custId,
number, requestType, startDate, endDate}, new CCCRowMapper());
在代码中,我传入了custId, number, requestType, etc.
,但是requestType
是一个可选参数,可能会以null
或empty
的形式返回,所以我不希望它如果是Object[]
或null
,则将其传递到empty
中。
该如何处理这种情况?
我可以在仅将我想要的参数传递到Object[]
的地方引入逻辑,但是,我想知道是否已经有内置的功能来处理此问题,而不是重新发明轮子。
答案 0 :(得分:4)
一种选择是使用NamedParameterJdbcTemplate
,因此不需要修改参数“ list”(现在是Found KeyTab solr.keytab for HTTP/<hostname>@REALM
Found KeyTab solr.keytab for HTTP/<hostname>@REALM
Entered SpNegoContext.acceptSecContext with state=STATE_NEW
SpNegoContext.acceptSecContext: receiving token = a0 82 04 b9 30 82 04 b5 a0 0d 30 0b 06 09 2a 86 48 86 f7 12 01 02 02 a1 04 03 02 01 f6 a2 82 04 9c 04 82 04 98 60 82 04 94 06 09 2a 86
Found KeyTab solr.keytab for HTTP/<hostname>@REALM
Found KeyTab solr.keytab for HTTP/<hostname>@REALM
Entered SpNegoContext.acceptSecContext with state=STATE_NEW
SpNegoContext.acceptSecContext: receiving token = a0 82 04 b9 30 82 04 b5 a0 0d 30 0b 06 09 2a 86 48 86 f7 12 01 02 02 a1 04 03 02 01 f6 a2 82 04 9c 04 82 04 98 60 82 04 94 06 09 2a 86
),只需修改SQL:
Map
更新
如果您有许多条件可能需要跳过,并且所有条件都可能被消除,请使用List<RealTimeDTO> query(String name) {
NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
String sql = "SELECT foo, bar" +
" FROM FooBar" +
" WHERE name" + (name == null ? " IS NULL" : "= :name");
Map<String, Object> params = new HashMap<>();
params.put("name", name);
return jdbcTemplate.query(sql, params, new CCCRowMapper());
}
来构建StringJoiner
子句:
WHERE
答案 1 :(得分:0)
您可以通过检查? IS NULL OR name = ?
之类的条件来使用静态SQL。但是您必须两次传递参数,并两次传递参数类型(at.sql.Types
)。
String sql = "SELECT foo, bar" +
" FROM FooBar" +
" WHERE (? IS NULL OR name = ?) ";
jdbcTemplate.query(sql, new Object[]{name, name}, new int[]{Types.VARCHAR, Types.VARCHAR}, new CCCRowMapper());
IMO并没有比使用条件更好。