JDBCTemplate可选参数

时间:2018-07-03 17:55:27

标签: java spring jdbctemplate

我正在使用spring JDBCTemplate。


我有一个场景,其中需要传递到我的查询函数中的参数是有条件的/可选的。例如,我有以下代码:

List<RealTimeDTO> result = jdbcTemplate.query(sql, new Object[] {custId, 
number, requestType, startDate, endDate}, new CCCRowMapper());

在代码中,我传入了custId, number, requestType, etc.,但是requestType是一个可选参数,可能会以nullempty的形式返回,所以我不希望它如果是Object[]null,则将其传递到empty中。

该如何处理这种情况?

我可以在仅将我想要的参数传递到Object[]的地方引入逻辑,但是,我想知道是否已经有内置的功能来处理此问题,而不是重新发明轮子。

2 个答案:

答案 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并没有比使用条件更好。