2010-07-14 11 views
12

Estoy tratando de usar un MapSqlParameterSource para crear una consulta utilizando una cláusula Like.Cláusula Spring Like

El código es algo como esto. La función que contiene recibe 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); 

esto no funciona correctamente, y me da en algún lugar entre 0-10 resultados cuando debería estar recibiendo miles. Básicamente, quiero que la consulta final tenga el siguiente aspecto:

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

pero evidentemente esto no está sucediendo. Cualquier ayuda sería apreciada.

Editar:

También he intentado poner el '%' s en el SQL, como

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

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

;

pero esto tampoco funciona.

Respuesta

26

Usted no quiere las comillas alrededor de su cadena de finalName. con los parámetros nombrados no necesita especificarlos. Esto debería funcionar:

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

Eres mi héroe. Muchas gracias. He estado trabajando en esto durante un período de tiempo embarazosamente largo. – Chris

+2

¿Qué tal una respuesta aceptada amor? – Jeff

+0

¿Cuál es la ventaja de concatenar los símbolos% en el parámetro vs ponerlo directamente en su consulta sql? SELECCIONAR recuento (*) FROM Personas WHERE INFERIOR (NOMBRE) COMO '%' +: pname + '%' –

0

Ha intentado colocar los comodines% en su cadena SQL (no el valor de la variable se unen en sí):

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

puede sugerir una manera de modificar el código existente para que pueda utilizar el '?' marcador de posición? No creo que pueda usarlo con un MapSqlParameterSource. Gracias – Chris

+1

es 'LIKE%: pname%' valid? –

+0

Lo he intentado. Me dio resultados similares (posiblemente el mismo). Creo que debe haber algo con las comillas simples o los signos '%' que interfieren con la consulta. – Chris

0

podemos utilizar JdbcTemplate sencilla en lugar de 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}); 

espero que útil para alguien usando JdbcTemplate

1

Esta solución funcionó para mí. Puse el "%" en la lista [] parámetros del objeto:

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;