Пружинная оговорка - PullRequest
       1

Пружинная оговорка

12 голосов
/ 14 июля 2010

Я пытаюсь использовать MapSqlParameterSource для создания запроса с использованием предложения Like.

Код выглядит примерно так.Функция, содержащая его, получает nameParam:

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%' "

;

но это тоже не работает.

Ответы [ 4 ]

26 голосов
/ 14 июля 2010

Вам не нужны кавычки вокруг вашей строки 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);
1 голос
/ 26 ноября 2014

Это решение сработало для меня.Я поместил «%» в список параметров 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;
0 голосов
/ 13 июня 2012

Мы можем использовать простой 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

0 голосов
/ 14 июля 2010

Вы пытались поместить символы подстановки% в строку sql (не само значение переменной bind):

String finalName= nameParam.toLowerCase().trim();
String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE '%:finalName%'";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...