Pergunta

Eu tenho a seguinte consulta nomeada em 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>

Estou em seguida, tentar executar esta linha usando a seguinte linha (constantes apontam para itens corretos):

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

Agora, quando eu executar o código, eu recebo um erro SQL sobre o nome da tabela que está saindo entre aspas:

CREATE TABLE IF NOT EXISTS 'wibble' (

Se eu tomar a consulta gerada e experimentá-lo sem as aspas em torno do nome da tabela, a consulta funciona bem. É apenas aquelas citações causando meu problema.

Então, minha pergunta é: O que eu preciso para usar em vez de setString ter certeza de que o meu parâmetro não está entre aspas? Eu tentei setParameter sem sorte e eu não poderia detectar qualquer alternativa melhor do API.

Obrigado por qualquer entrada, Lee

Foi útil?

Solução

Eu não acho que você pode usar parâmetros nomeados para identificadores de banco de dados, como nomes de tabela. Somente expressões de valor. Se fosse permitido, seria torná-lo suscetível a ataques de injeção SQL. Como alternativa, você poderia construir a consulta em Java.

Outras dicas

Que tipo de banco de dados você está usando? Alguns bancos de dados diferenciam maiúsculas e minúsculas (Na verdade a maioria são exceto Microsoft). Assim, a tabela com o nome 'wibble' é diferente de 'wibble' e ainda diferente de 'wibble'.

Quando você cria uma tabela chamada wibble sem aspas, a maioria dos bancos de dados como Oracle criar esta como a tabela chamada em todas as tampas 'wibble'. Quando você consulta que você usá-lo como você faz aqui:

SELECT * FROM wibble

O banco de dados interpretaria isso como 'wibble' e não há nenhum problema.

O provedor de persistência parece sempre colocar isso entre aspas. Para tornar o nome citado a mesma que foi criado como, você deve aproveitar isso. Então tente o seguinte:

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

Isso deve criar a declaração com 'wibble', que deve ser o mesmo que wibble sem aspas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top