2010-07-14 17 views
12

Sto cercando di utilizzare un MapSqlParameterSource per creare una query utilizzando una clausola simile.clausola Spring Like

Il codice è qualcosa di simile. La funzione di contenimento che riceve 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); 

Questo non funziona correttamente, dandomi da qualche parte tra 0-10 risultati quando dovresti ricevere migliaia. In sostanza vorrei che la query finale assomigliasse:

SELECT count(*) FROM People WHERE LOWER(NAME) LIKE '%name%' 

ma questo evidentemente non sta accadendo. Qualsiasi aiuto sarebbe apprezzato.

Edit:

Ho anche provato a mettere il '%' s in SQL, come

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

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

;

ma questo non funziona neanche.

risposta

26

non si vuole le virgolette intorno alla vostra stringa di NomeFinale. con i parametri nominati non è necessario specificarli. Questo dovrebbe funzionare:

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

Sei il mio eroe. Molte grazie. Ho lavorato su questo per un periodo di tempo imbarazzante. – Chris

+2

che ne dici di una risposta accettata amore? – Jeff

+0

Qual è il vantaggio di concatenare i simboli% nel parametro vs metterlo direttamente nella query sql? SELECT count (*) FROM People WHERE LOWER (NAME) COME '%' +: pname + '%' –

0

Hai provato mettendo le wild card% nella stringa di SQL (non il valore della variabile bind stesso):

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

Puoi suggerire un modo per modificare il codice esistente in modo da poter utilizzare il '?' segnaposto? Non credo che tu possa usarlo con MapSqlParameterSource. Grazie – Chris

+1

è 'LIKE%: pname%' valido? –

+0

L'ho provato. Mi ha dato risultati simili (forse uguali). Penso che ci deve essere qualcosa con le virgolette singole o i segni '%' che interferiscono con la query. – Chris

0

possiamo usare semplice JdbcTemplate invece di 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}); 

Speranza utile per qualcuno usando JdbcTemplate

1

Questa soluzione ha funzionato per me. Inserisco "%" nell'elenco dei parametri 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;