2010-07-19 7 views
1

J'utilise simpleJDBCTemplate pour insérer une valeur dans une base de données postgre.simpleJDBCTemplate ne remplace pas le paramètre quoted

String sql "insert into testTable values(:bla, :blah, functionThatTakesAText(':blu'))" 
BeanPropertySqlParameterSource namedParameters = new BeanPropertySqlParameterSource(lighting); 
simpleJdbcTemplate.update(sql, namedParameters); 

Maintenant, le paramètre blu est en fait un certain nombre (sql réelle prend 2 réelle de) qui est lu à partir d'un fichier donné par le client.

En conséquence, la base de données reçoit quelque chose comme ce qui suit:

insert into testTable values(?, ?, functionThatTakesAText(':blu')) 

et ne parvient pas à remplacer le: paramètre blu comme prévu.

La solution de contournement que j'utilise actuellement consiste à remplacer le paramètre blu par sa valeur à l'aide d'une expression régulière, mais je ne suis pas sûr de sa sécurité.

Comment pourriez-vous résoudre ce problème?

Répondre

2

Spring ignorera tout ce qui est entre guillemets dans le SQL (voir la méthode skipCommentsAndQuotes() de NamedParameterUtils), car tout élément entre guillemets ne doit pas être touché.

Cela est logique dans ce contexte - vous voulez la déclaration préparée à dire

functionThatTakesAText(?) 

plutôt que

functionThatTakesAText('?') 

Essayez de supprimer les citations là, et l'espace réservé doit être remplacé correctement.

+0

"voir la méthode skipCommentsAndQuotes() de NamedParameterUtils" Je ne peux pas le trouver dans la documentation * * - http://static.springsource.org/spring/docs/2.5.x/api/org/springframework /jdbc/core/namedparam/NamedParameterUtils.html –

+0

@awregan: Ce n'est pas dans la documentation, c'est dans le code source. – skaffman

Questions connexes