我正在使用spring JDBCTemplate。
我有一个场景,需要传递给我的查询函数的参数是条件/可选的。例如,我有以下代码:
List<RealTimeDTO> result = jdbcTemplate.query(sql, new Object[] {custId,
number, requestType, startDate, endDate}, new CCCRowMapper());在代码中,我传入了custId, number, requestType, etc.,但是,requestType是一个可选的参数,可能以null或empty的形式返回,所以如果是null或empty,我不希望它被传递到Object[]中。
我该如何处理这种情况呢?
我可以引入逻辑,只将我想要的参数传递到Object[]中,但是,我想知道是否已经有内置的功能来处理这个问题,而不是重新发明轮子。
发布于 2018-07-03 18:06:56
一种选择是使用NamedParameterJdbcTemplate,因此参数"list“(现在是Map)不需要修改,只有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());
}更新
如果您有许多需要跳过的条件,并且所有条件都可能被删除,那么使用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());
}发布于 2019-11-20 14:36:03
您可以通过检查像? 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());我并不比使用条件更好。
发布于 2022-11-23 21:45:38
我想用下一个例子将NamedParameter添加到@Snozzlebert的答案中。
如果要传递空值,则必须指定参数的类型,否则将得到一个NullPointerException。
@Autowired
NamedParameterJdbcTemplate namedJdbcTemplate;
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("name", name, Types.VARCHAR);
parameters.addValue("phone", null, Types.VARCHAR);
parameters.addValue("age", null, Types.SMALLINT);
List<RealTimeDTO> list = namedJdbcTemplate.query(
"SELECT foo, bar\n" +
" FROM FooBar\n" +
" WHERE (:name IS NULL OR name = :name) AND \n" +
" (:phone IS NULL OR phone = :phone) AND \n" +
" (:age IS NULL OR age = :age)" +,
parameters,
new RealTimeDTOMapper());https://stackoverflow.com/questions/51160468
复制相似问题