Frage

Ich habe die folgende benannte Abfrage in Hibernate bekam:

<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>

Ich versuche dann diese Zeile auszuführen unter Verwendung der folgenden Zeile (Konstanten zeigen Artikel zu korrigieren):

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

Nun, wenn ich den Code ausführen, bekomme ich einen SQL-Fehler in Bezug auf die Tabellennamen, die aus in Anführungszeichen KOMMEN:

CREATE TABLE IF NOT EXISTS 'wibble' (

Wenn ich die erzeugte Abfrage und versuchen, es ohne die Anführungszeichen um den Tabellennamen, funktioniert die Abfrage in Ordnung. Es ist nur diese Zitate mein Problem verursacht.

Also meine Frage ist: Was benötige ich, statt setString zu verwenden, um sicherzustellen, dass meine Parameter nicht in Anführungszeichen gesetzt wird? Ich habe versucht, setParameter ohne Glück und ich konnte keine bessere Alternative von der API erkennen.

Vielen Dank für jede Eingabe, Lee

War es hilfreich?

Lösung

Ich glaube nicht, Sie benannte Parameter für die Datenbankkennungen wie Tabellennamen verwenden können. Nur Wertausdrücke. Wenn es erlaubt wäre, würde es auf SQL-Injection-Angriffe anfällig machen. Als Alternative könnten Sie die Abfrage in Java bauen.

Andere Tipps

Welche Datenbanktyp verwenden Sie? Einige Datenbanken sind Groß- und Kleinschreibung (Eigentlich sind die meisten mit Ausnahme von Microsoft). So ist die Tabelle mit dem Namen ‚wibble‘ unterscheidet sich von ‚Wibble‘ und noch verschieden von ‚Wibble‘.

Wenn Sie eine Tabelle mit dem Namen wibble ohne Anführungszeichen erstellen, die meisten Datenbanken wie Oracle erstellen dies als die Tabelle in allen Caps ‚Wibble‘ genannt. Wenn Sie es Abfrage verwenden Sie es, wie Sie hier tun:

SELECT * FROM wibble

Die Datenbank würde dies als ‚Wibble‘ interpretieren, und es gibt kein Problem.

Die Persistenz-Provider scheint dies immer in Anführungszeichen zu setzen. Um die genannten Namen zu machen das gleiche, wie es so erstellt wurde, sollten Sie es nutzen. Also versuchen Sie dies:

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

Das sollte die Aussage mit ‚Wibble‘ schaffen, die ohne Anführungszeichen gleich wie wibble sein sollte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top