Pregunta

Tengo la siguiente consulta con nombre en Hibernate:

<sql-query name="CreateLogTable">
  CREATE TABLE IF NOT EXISTS :tableName (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `url` VARCHAR (750) NOT NULL, 
    `query` VARCHAR (500), 
    `ipaddress` VARCHAR (39), 
    `datetime` DATETIME NOT NULL, 
    `hits` MEDIUMINT UNSIGNED DEFAULT '0' NOT NULL, 
    `path_id` VARCHAR (8), 
    PRIMARY KEY(`id`),
    UNIQUE(`id`),
    INDEX(`id`,`query`,`datetime`,`path_id`)
  ) TYPE = MyISAM
</sql-query>

Estoy a continuación, tratando de ejecutar esta línea usando la siguiente línea (constantes apuntan a corregir artículos):

getSession().getNamedQuery(CREATE_SQL).setString(CREATE_SQL_TABLE_NAME_PARAM, "wibble").executeUpdate();

Ahora, cuando ejecuto el código, me sale un error SQL en relación con el nombre de la tabla, que está saliendo entre comillas:

CREATE TABLE IF NOT EXISTS 'wibble' (

Si tomo la consulta generada y probarlo sin las comillas alrededor del nombre de la tabla, la consulta funciona bien. Es sólo aquellas cotizaciones que causan mi problema.

Así que mi pregunta es: ¿Qué necesito para usar en lugar de setString para asegurarse de que mi parámetro no está entre comillas? He intentado setParameter sin suerte y no pude detectar ninguna alternativa mejor a partir de la API.

Gracias por cualquier entrada, Lee

¿Fue útil?

Solución

No creo que se puede utilizar parámetros con nombre para identificadores de base de datos como nombres de tabla. Sólo expresiones de valor. Si se le permitiera, sería hacer más susceptible a ataques de inyección SQL. Como alternativa, se puede construir la consulta en Java.

Otros consejos

¿Qué tipo de base de datos está utilizando? Algunas bases de datos son sensibles a mayúsculas (En realidad la mayoría son a excepción de Microsoft). Así la tabla denominada 'wibble' es diferente de 'wibble' y todavía diferente de 'wibble'.

Cuando se crea una tabla llamada wibble sin comillas, la mayoría de las bases de datos como Oracle crean esto como la tabla denominada en todas las tapas 'wibble'. Cuando se consulta que se utiliza como lo hace aquí:

SELECT * FROM wibble

La base de datos podría interpretar esto como 'wibble' y no hay ningún problema.

El proveedor de persistencia parece poner siempre esta entre comillas. Para hacer que el nombre citado el mismo que fue creado como, usted debe capitalizarla. Así que trate de esto:

getSession().getNamedQuery(CREATE_SQL).setString(CREATE_SQL_TABLE_NAME_PARAM, "WIBBLE").executeUpdate();

Esto debería crear la declaración con 'wibble' que debe ser el mismo que wibble sin comillas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top