JDBCTemplate необязательные параметры - PullRequest
0 голосов
/ 03 июля 2018

Я использую пружину 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[], однако мне было интересно, есть ли уже встроенная функциональность, которая обрабатывает это, вместо того, чтобы заново изобретать колесо.

1 Ответ

0 голосов
/ 03 июля 2018

Один из вариантов - использовать NamedParameterJdbcTemplate, поэтому параметр «список» (теперь 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());
}

UPDATE

Если у вас есть много условий, которые, возможно, необходимо пропустить, и все условия могут быть устранены, тогда используйте 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());
}
...