Rob*_*bin 5 java spring jdbctemplate
我正在使用spring JDBCTemplate。
我有一种情况,其中需要传递到查询函数中的参数是有条件的/可选的。例如,我有以下代码:
List<RealTimeDTO> result = jdbcTemplate.query(sql, new Object[] {custId,
number, requestType, startDate, endDate}, new CCCRowMapper());
Run Code Online (Sandbox Code Playgroud)
在代码中,我通过了custId, number, requestType, etc.。然而,requestType就是可能会回来作为可选的参数null或者empty,所以我不希望它被传递到你Object[],如果它要么是null或empty。
如何处理这种情况?
我可以在仅将所需参数传递给的情况下引入逻辑Object[],但是,我想知道是否已经有处理此问题的内置功能,而不是重新发明轮子。
一种选择是使用NamedParameterJdbcTemplate,因此Map不需要修改参数“ list”(现在是a ),只需修改SQL:
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());
}
Run Code Online (Sandbox Code Playgroud)
更新
如果您有许多条件可能需要跳过,并且所有条件都可能被消除,则可以使用StringJoiner构建以下WHERE子句:
List<RealTimeDTO> query(String name, String phone, int age) {
NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
StringJoiner where = new StringJoiner(" AND ", " WHERE ", "").setEmptyValue("");
if (name != null)
where.add("name = :name");
if (phone != null)
where.add("phone = :phone");
if (age != 0)
where.add("age = :age");
String sql = "SELECT foo, bar" +
" FROM FooBar" +
where;
Map<String, Object> params = new HashMap<>();
params.put("name", name);
params.put("phone", phone);
params.put("age", age);
return jdbcTemplate.query(sql, params, new CCCRowMapper());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3299 次 |
| 最近记录: |