Domanda

Ho la seguente query denominata in 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>

Sto quindi cercando di eseguire questa linea utilizzando la seguente riga (costanti puntano a correggere gli elementi):

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

Ora, quando eseguo il codice, ottengo un errore SQL per quanto riguarda il nome della tabella, che è venuta fuori racchiuso tra virgolette:

CREATE TABLE IF NOT EXISTS 'wibble' (

Se prendo la query generato e provarlo senza le virgolette attorno al nome della tabella, la query funziona bene. E 'solo quelle citazioni che causano il mio problema.

Quindi la mia domanda è: che cosa ho bisogno di usare al posto di setString per assicurarsi che il mio parametro non è racchiuso tra virgolette? Ho provato setParameter senza fortuna e non ho potuto individuare alcuna alternativa migliore dal API.

Grazie per ogni ingresso, Lee

È stato utile?

Soluzione

Non credo che è possibile utilizzare parametri denominati per gli identificatori di database come nomi di tabella. Solo espressioni di valore. Se fosse permesso, sarebbe suscettibile ad attacchi di SQL injection. In alternativa, si potrebbe costruire la query in Java.

Altri suggerimenti

Che tipo di database stai usando? Alcuni database sono case sensitive (In realtà la maggior parte sono ad eccezione di Microsoft). Quindi la tabella denominata 'ciccio' è diverso da 'ciccio' e ancora diverso da 'ciccio'.

Quando si crea una tabella denominata ciccio senza le virgolette, la maggior parte dei database come Oracle creano questo come la tabella denominata in tutte le protezioni 'Wibble'. Quando si esegue una query che si utilizza come si fa qui:

SELECT * FROM wibble

La banca dati dovrebbe interpretare questo come 'ciccio' e non c'è nessun problema.

Il provider di persistenza sembra mettere sempre presente tra virgolette. Per rendere il nome citato lo stesso come è stato creato come, si dovrebbe capitalizzare esso. Quindi, provate questo:

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

Questo dovrebbe creare l'istruzione con 'ciccio', che dovrebbe essere lo stesso di ciccio senza virgolette.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top