Tabella Nome problemi con query Hibernate Chiamato
-
16-09-2019 - |
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
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.