Question

J'ai la requête suivante nommée dans 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>

Je suis alors en train d'exécuter cette ligne en utilisant la ligne suivante (constantes pointent pour corriger les éléments):

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

Maintenant, quand j'exécuter le code, je reçois une erreur SQL concernant le nom de la table qui est à venir entouré par des guillemets:

CREATE TABLE IF NOT EXISTS 'wibble' (

Si je prends la requête générée et essayer sans les guillemets autour du nom de la table, la requête fonctionne très bien. Il est juste ces citations causant mon problème.

Alors, ma question est: Que dois-je utiliser au lieu de setString pour vous assurer que mon paramètre n'est pas entouré par des guillemets? J'ai essayé setParameter avec pas de chance et je ne pouvais repérer une meilleure alternative de l'API.

Merci pour toute entrée, Lee

Était-ce utile?

La solution

Je ne pense pas que vous pouvez utiliser des paramètres nommés pour les identificateurs de base de données comme les noms de tables. Seules les expressions de valeur. Si elle était autorisée, il vous prédisposer aux attaques par injection SQL. Comme alternative, vous pouvez construire la requête en Java.

Autres conseils

Quel type base de données utilisez-vous? Certaines bases de données sont sensibles à la casse (En fait, la plupart sont à l'exception de Microsoft). Ainsi, la table nommée « Wibble » est différent de « Wibble » et toujours différent de « Wibble ».

Lorsque vous créez une table nommée Wibble sans guillemets, la plupart des bases de données telles que Oracle créent ce que la table nommée en majuscules de la Wibble. Lorsque vous interrogez, il vous l'utilisez comme vous le faites ici:

SELECT * FROM wibble

La base de données interprète cela comme « Wibble » et il n'y a pas de problème.

Le fournisseur de persistance semble toujours mettre cela entre guillemets. Pour le nom cité même comme il a été créé, vous devez capitaliser. Donc, essayez ceci:

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

Cela devrait créer la déclaration avec « Wibble » qui devrait être le même que Wibble sans guillemets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top