2010-07-14 3 views
12

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

Код выглядит примерно так. Функция, содержащая его получает 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%' 

, но это, очевидно, не происходит. Любая помощь будет оценена по достоинству.

Edit:

Я также попытался поставив '%' s в SQL, как

String finalName= nameParam.toLowerCase().trim(); 

String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE '%:pname%' " 

;

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

ответ

26

Вы не хотите кавычки вокруг вашего 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

Ты мой герой. Большое спасибо. Я работаю над этим в течение смутно длительного периода времени. – Chris

+2

как насчет какой-то принятой ответной любви? – Jeff

+0

В чем преимущество конкатенации символов% в параметр vs, непосредственно помещающих его в ваш sql-запрос? SELECT count (*) FROM People WHERE LOWER (NAME) LIKE '%' +: pname + '%' –

0

Вы пробовали размещая% диких карт в SQL строке (не для привязки переменной само значение):

String finalName= nameParam.toLowerCase().trim(); 
String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE '%:finalName%'"; 
+0

Можете ли вы предложить способ изменить существующий код, чтобы я мог использовать '?' заполнитель? Я не думаю, что вы можете использовать его с MapSqlParameterSource. Спасибо – Chris

+1

is 'LIKE%: pname%' valid? –

+0

Я пробовал это. Это дало мне похожие (возможно, такие же) результаты. Я думаю, что должно быть что-то с одинарными кавычками или знаками «%», которые мешают запросу. – Chris

0

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

1

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