2009-08-14 5 views
1

J'ai la requête suivante nommée dans Hibernate:Nom de la table Problèmes avec Hibernate requête nommée

<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 donc 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 l'essaie sans les guillemets autour du nom de la table, la requête fonctionne bien. Ce sont juste ces citations qui causent mon problème.

Donc ma question est: Qu'est-ce que je dois utiliser au lieu de setString pour m'assurer que mon paramètre n'est pas entouré de guillemets? J'ai essayé setParameter sans aucune chance et je ne pouvais pas trouver une meilleure alternative de l'API.

Merci pour toute entrée, Lee

Répondre

2

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

0

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). Donc, la table nommée 'wibble' est différente de 'WiBbLe' et reste différente de 'WIBBLE'.

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

SELECT * FROM wibble 

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

Le fournisseur de persistance semble toujours mettre entre guillemets. Pour que le nom cité soit le même que celui qui a été créé, vous devez le mettre en majuscule. 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.

+0

La base de données est une base de données MySQL, qui ne tient pas compte de la casse. Je ne pense pas que ce soit un problème. J'essaie juste une déclaration de création pour le moment donc à ce stade tout ce que j'utilise devrait être bon. Il semble que ce soient ces citations dont je dois me débarrasser. –

Questions connexes