Spring Как пункт
Я пытаюсь использовать MapSqlParameterSource для создания запроса с помощью предложения Like.
Код выглядит примерно так. Функция, содержащая его, получает имяParam:
String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE :pname ";
String finalName= "'%" +nameParam.toLowerCase().trim() + "%'";
MapSqlParameterSource namedParams= new MapSqlParameterSource();
namedParams.addValue("pname", finalName);
int count= this.namedParamJdbcTemplate.queryForInt(namecount, namedParams);
Это не работает правильно, давая мне где-то между 0-10 результатами, когда я должен получать тысячи. Я хочу, чтобы окончательный запрос выглядел так:
SELECT count(*) FROM People WHERE LOWER(NAME) LIKE '%name%'
но это, очевидно, не происходит. Любая помощь будет оценена.
Изменить:
Я также попытался поставить '% в SQL, например
String finalName= nameParam.toLowerCase().trim();
String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE '%:pname%' "
;
но это тоже не работает.
Ответы
Ответ 1
Вам не нужны кавычки вокруг вашей строки finalName. с указанными параметрами вам не нужно указывать их. Это должно работать:
String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE :pname ";
String finalName= "%" + nameParam.toLowerCase().trim() + "%";
MapSqlParameterSource namedParams= new MapSqlParameterSource();
namedParams.addValue("pname", finalName);
int count= this.namedParamJdbcTemplate.queryForInt(namecount, namedParams);
Ответ 2
Это решение сработало для меня. Я помещаю "%" в список параметров Object []:
String sqlCommand = "SELECT customer_id, customer_identifier_short, CONCAT(RTRIM(customer_identifier_a),' ', RTRIM(customer_identifier_b)) customerFullName "
+ " FROM Customer "
+ " WHERE customer_identifier_short LIKE ? OR customer_identifier_a LIKE ? "
+ " LIMIT 10";
List<Customer> customers = getJdbcTemplate().query(sqlCommand, new Object[] { query + "%", query + "%"}, new RowMapper<Customer>() {
public Customer mapRow(ResultSet rs, int i) throws SQLException {
Customer customer = new Customer();
customer.setCustomerFullName(rs.getString("customerFullName"));
customer.setCustomerIdentifier(rs.getString("customer_identifier_short"));
customer.setCustomerID(rs.getInt("customer_id"));
return customer;
}
});
return customers;
Ответ 3
Вы пытались помещать% wild cards в свою строку sql (а не значение самой переменной привязки):
String finalName= nameParam.toLowerCase().trim();
String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE '%:finalName%'";
Ответ 4
Мы можем использовать простой JdbcTemplate вместо NamedParamJdbcTemplate
String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE ? ";
String finalName= "%" +nameParam.toLowerCase().trim() + "%"; //Notes: no quote
getJdbcTemplate().queryForInt(namecount, new Object[] {finalName});
Надеемся, что это поможет кому-то, использующему JdbcTemplate