2009-07-08 7 views
32

preparado en muchos lenguajes de programación algo como esto es posible para comandos preparados:El uso de una variable en lugar de un índice de parámetro con un JDBC declaración

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

Pero no con java.sql.PreparedStatement. En Java, uno tiene que usar índices de parámetros:

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

¿Existe alguna solución para trabajar con variables de cadena como en el primer ejemplo? ¿No se usa "$ {. *}" En otro lugar del lenguaje SQL, o hay algún conflicto? Porque entonces lo implementaría yo mismo (analizando la cadena SQL y reemplazando todas las variables por "?" Y luego haciéndolo de la manera Java).

Saludos, Kai

+4

Me desconcertado también. http://www.javaworld.com/javaworld/jw-04-2007/jw-04-jdbc.html tiene algo que utilicé varias veces. – akarnokd

+0

Hola kd304, me pregunto por qué no dejaste tu mensaje como respuesta en lugar de usar un comentario. Porque creo que es la forma en que puedo resolver ese problema. – Zardoz

+0

@tokel: No estaba seguro de que tu pregunta fuera teórica o no y mi comentario realmente no responde a tu pregunta escrita. – akarnokd

Respuesta

5

El uso de un PreparedStatement prima, esto no es posible, como usted dice. Es posible con CallableStatement, pero eso requiere un procedimiento almacenado en lugar de solo una declaración SQL.

Las capas ORM como Hibernate también proporcionan sustitución de parámetros nombrados, e Hibernate también le permite ejecutar SQL nativo, omitiendo completamente la funcionalidad de asignación OR.

Por lo tanto, si estuviera realmente interesado en utilizar parámetros con nombre, podría utilizar Hibernate como forma de hacerlo; solo estarías usando una pequeña fracción de su funcionalidad.

+0

Olvide mi idea, @laz tiene una mucho mejor. – skaffman

+0

Creo que el controlador Oracle JDBC admite la invocación de sentencias de SQL regulares con parámetros con nombre cuando se usa CallableStatement, no solo para procedimientos. PostgreSQL dice "Todavía no se implementa" (postgresql-9.1-901.jdbc4.jar) – Oliv

+0

Eso es muy triste, ya que DBMSsupports esto, al menos SQL Server, y JSBC intrnaly crea parámetros con nombre, como por ejemplo: '@ P0 nvarchar (4000), @ P1 varchar (8000), @ P2 nvarchar (4000), @ P3 smallint, @ P4 nvarchar (4000), @ P5 int' –

26

Standard JDBC PreparedStatements no tienen esta capacidad. Spring JDBC proporciona esta funcionalidad a través del NamedParameterJdbcTemplate.

+0

Gracias por la muy buena solución. El problema para mí es que formará parte de otro marco de código abierto y no quiero importar tanto código allí. De lo contrario, habría utilizado tu solución :-) – Zardoz

Cuestiones relacionadas