2010-07-14 6 views
12

J'essaie d'utiliser MapSqlParameterSource pour créer une requête en utilisant une clause Like.Spring Like clause

Le code est quelque chose comme ceci. La fonction contenant reçoit 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); 

Ce ne fonctionne pas correctement, me donner quelque part entre 0-10 résultats alors que je devrais recevoir des milliers. Je veux essentiellement la requête finale à ressembler:

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

mais cela ne se produit évidemment pas. Toute aide serait appréciée.

Edit:

J'ai aussi essayé de mettre la s '%' dans le SQL, comme

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

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

;

mais cela ne fonctionne pas non plus.

Répondre

26

Vous ne voulez pas les guillemets autour de votre chaîne de finalName. avec les paramètres nommés, vous n'avez pas besoin de les spécifier. Cela devrait fonctionner:

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

Vous êtes mon héros. Merci beaucoup. J'ai travaillé sur ceci pour une période embarrassingly longue. – Chris

+2

que diriez-vous de la réponse acceptée l'amour? – Jeff

+0

Quel est l'avantage de concaténer les symboles% dans le paramètre par rapport à sa mise en place dans votre requête sql? SELECT count (*) FROM Personnes O L LOWER (NOM) COMME '%' +: pname + '%' –

0

Avez-vous essayé de placer les cartes% sauvages dans votre chaîne SQL (pas la valeur de la variable se lier lui-même):

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

Pouvez-vous suggérer un moyen de modifier le code existant afin que je puisse utiliser le '?' espace réservé? Je ne crois pas que vous pouvez l'utiliser avec un MapSqlParameterSource. Merci – Chris

+1

est 'LIKE%: pname%' valide? –

+0

J'ai essayé ça. Cela m'a donné des résultats similaires (peut-être même). Je pense qu'il doit y avoir quelque chose avec les guillemets simples ou les signes '%' qui interfèrent avec la requête. – Chris

0

Nous pouvons utiliser JdbcTemplate simple, au lieu 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}); 

Espérons utile pour quelqu'un en utilisant JdbcTemplate

1

Cette solution a fonctionné pour moi. Je mets le "%" sur la liste des paramètres 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; 
Questions connexes