首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDBCTemplate可选参数

JDBCTemplate可选参数
EN

Stack Overflow用户
提问于 2018-07-03 17:55:27
回答 4查看 16.2K关注 0票数 8

我正在使用spring JDBCTemplate。

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

代码语言:javascript
复制
List<RealTimeDTO> result = jdbcTemplate.query(sql, new Object[] {custId, 
number, requestType, startDate, endDate}, new CCCRowMapper());

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

我该如何处理这种情况呢?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-07-03 18:06:56

一种选择是使用NamedParameterJdbcTemplate,因此参数"list“(现在是Map)不需要修改,只有SQL:

代码语言:javascript
复制
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子句:

代码语言:javascript
复制
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());
}
票数 18
EN

Stack Overflow用户

发布于 2019-11-20 14:36:03

您可以通过检查像? IS NULL OR name = ?这样的条件来使用静态SQL。但是必须传递参数两次,传递参数类型(at.sql.Types)两次。

代码语言:javascript
复制
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());

我并不比使用条件更好。

票数 1
EN

Stack Overflow用户

发布于 2022-11-23 21:45:38

我想用下一个例子将NamedParameter添加到@Snozzlebert的答案中。

如果要传递空值,则必须指定参数的类型,否则将得到一个NullPointerException。

代码语言:javascript
复制
@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());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51160468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档