2010-05-11 10 views
4

Je code suivant:Comment exécuter une requête avec la clause IN au printemps?

try { 
      MapSqlParameterSource parameters = new MapSqlParameterSource(); 
      parameters.addValue("ids", year); 

      return this.template.getJdbcOperations().query(
        "SELECT * FROM INCOME WHERE PROVNUM=? AND FISCALDATE IN (:ids)", this.rowMapper, parameters); 


     }catch (EmptyResultDataAccessException ex) { 
      return null; 
     } 

Mais je ne suis pas en mesure d'envoyer la valeur PROVNUM. comment faire ça?

besoin d'aide, merci.

+2

Le problème spécifique n'a rien à voir avec la clause IN. – BalusC

Répondre

4

Il suffit d'utiliser un paramètre nommé pour « provnum » aussi:

String sql = "SELECT * FROM INCOME WHERE PROVNUM=:provnum AND FISCALDATE IN (:ids)" 
MapSqlParameterSource parameters = new MapSqlParameterSource(); 
parameters.addValue("ids", year); 
parameters.addValue("provnum", ...); 
return template.getJdbcOperations().query(sql, rowMapper, parameters); 
+0

obtenir cette exécution org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [SELECT * FROM REVENU O WH PROVNUM =: provNum ET FISCALDATE IN (: ids)]; Impossible de convertir entre org.springframework.jdbc.core.namedparam.MapSqlParameterSource et JAVA_OBJECT .; Exception imbriquée est java.sql.SQLException: Impossible de convertir entre org.springframework.jdbc.core.namedparam.MapSqlParameterSource et JAVA_OBJECT. – GuruKulki

+0

La documentation de SpringSource à ce sujet peut être trouvée: http://static.springsource.org/spring/docs/2.5.x/reference/jdbc.html#jdbc-in-clause Assurez-vous que vous utilisez une collection implémentation de l'interface List et que vous n'utilisez pas d'objet personnalisé. Pour être honnête, je n'ai pas essayé ceci avec une liste de dates, mais l'exemple de Matt fonctionnerait pour la liste , la liste etc. – jnt30

+0

@GK veuillez signaler le code en question, y compris les types/valeurs de tous les paramètres que vous ajoutez avec 'addValue()' –

9

Il semble que vous mélangez des paramètres nommés et de position. Il est préférable d'utiliser l'un ou l'autre, mais pas les deux.

Essayez

MapSqlParameterSource parameters = new MapSqlParameterSource(); 
parameters.addValue("ids", year); 
parameters.addValue("provnum", provnum); 

return this.template.getJdbcOperations().query(
        "SELECT * FROM INCOME WHERE PROVNUM=:provnum AND FISCALDATE IN (:ids)", this.rowMapper, parameters); 

Après votre commentaire, je vois que vous utilisez la mauvaise surcharge de la méthode query(): il y a assez peu de choix, il est donc pas surprenant que quelques erreurs peuvent se glisser!

Vous devez appeler

return this.template.getJdbcOperations().query(
     "SELECT ... etc.", parameters, this.rowMapper); 

Dans votre premier appel, vous appelez la version query(String sql, RowMapper mapper, Object... params) qui attend les paramètres littérales. L'appel révisé est query (String sql, paramètres SqlParameterSource, mappeur RowMapper) - SqlParamtersSource en tant que second argument est la clé. Aussi, il vaut la peine de vérifier que vous utilisez NamedParameterJdbcTemplate.

+1

Je pense que c'est la clé, assurez-vous que ce que vous utilisez est le NamedParameterJdbcTemplate, le JdbcTemplate ordinaire ne supporte pas les paramètres nommés. – mezmo

Questions connexes