2009-07-08 11 views
32

Dans de nombreux langages de programmation quelque chose comme cela est possible pour des déclarations préparées:En utilisant une variable au lieu d'un index des paramètres avec un JDBC préparé déclaration

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ${name}"); 
statement.setString("name", "IBM"); 

Mais pas avec java.sql.PreparedStatement. En Java, il faut utiliser des indices de paramètres:

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ?"); 
statement.setString(1, "IBM"); 

Existe-t-il une solution pour travailler avec des variables de chaîne comme dans le premier exemple? Est-ce que "$ {. *}" N'est pas utilisé ailleurs dans le langage SQL, ou y a-t-il des conflits? Parce que je l'implémenterais moi-même (en analysant la chaîne SQL et en remplaçant chaque variable par "?" Puis en la faisant de la manière Java).

Cordialement, Kai

+4

Il m'a laissé perplexe aussi. http://www.javaworld.com/javaworld/jw-04-2007/jw-04-jdbc.html a quelque chose que j'ai utilisé plusieurs fois. – akarnokd

+0

Hey kd304, je me demande pourquoi vous n'avez pas laissé votre message comme réponse au lieu d'utiliser un commentaire. Parce que je pense que c'est la façon pour moi de résoudre ce problème. – Zardoz

+0

@tokel: Je n'étais pas sûr que votre question soit théorique ou non et mon commentaire ne répond pas vraiment à votre question tapée. – akarnokd

Répondre

5

En utilisant une PreparedStatement brute, ce n'est pas possible, comme vous le dites. C'est possible avec CallableStatement, mais cela nécessite une procédure stockée plutôt qu'une simple instruction SQL.

Les couches ORM telles que Hibernate fournissent également une substitution de paramètres nommés, et Hibernate vous permet également d'exécuter du SQL natif, en contournant complètement la fonctionnalité de mappage OR. Donc, si vous teniez réellement à utiliser des paramètres nommés, vous pourriez utiliser Hibernate comme un moyen de le faire; vous utiliseriez seulement une infime fraction de ses fonctionnalités.

+0

Oubliez mon idée, @laz en a une bien meilleure. – skaffman

+0

Je pense que le pilote Oracle JDBC prend en charge l'appel d'instructions SQL régulières avec des paramètres nommés lors de l'utilisation de CallableStatement, pas seulement pour les procédures. PostgreSQL dit "Pas encore implémente" (postgresql-9.1-901.jdbc4.jar) – Oliv

+0

C'est tellement triste, comme DBMS le supporte, au moins le serveur SQL le fait, et JSBC intrnaly crée des paramètres nommés, comme suit: '@ P0 nvarchar (4000), @ P1 varchar (8000), @ P2 nvarchar (4000), @ P3 smallint, @ P4 nvarchar (4000), @ P5 int' –

26

Les instructions PreparedStatements JDBC standard n'ont pas cette capacité. Spring JDBC fournit cette fonctionnalité via NamedParameterJdbcTemplate.

+0

Merci pour la très bonne solution. Le problème pour moi est que cela fera partie d'un autre framework open source et je ne veux pas importer autant de code là-bas. Sinon j'aurais utilisé ta solution :-) – Zardoz

Questions connexes