2010-06-25 5 views
4

Je rencontre un problème avec mon ORMLite package. Lorsque j'ai généré le schéma d'une table, j'ai pensé que ce serait une bonne pratique d'échapper à tous les noms d'entités. Cela protégerait une classe Java ou nom de champ d'être un mot réservé SQL:Problèmes avec les noms de tables et de champs d'échappement dans Derby et Hsqldb

CREATE TABLE "footable" ("stuff" VARCHAR(255)) 

Je suis maintenant d'ajouter le support de requête « brut » de sorte que ORMLite peut aider les utilisateurs à effectuer leurs propres requêtes. Cependant, je trouve qu'avec Derby et Hsqldb, les noms d'entités ne peuvent pas être utilisés sans s'échapper. Par exemple, la requête suivante:

SELECT * FROM footable 

génère les erreurs suivantes:

Derby: ERROR 42X05: Table/View 'FOOTABLE' does not exist. 
Hsqldb: Table not found in statement [select * from footable] 

Il fonctionne très bien si la table de sélection est également échappé comme "footable". Les autres bases de données prises en charge par ORMLite fonctionnent correctement avec ou sans l'échappement: MySQL, Postgres, Microsoft SQL Server, H2 et Sqlite. Y at-il de meilleurs moyens d'échapper des mots réservés dans Derby et Hsqldb?

D'autres idées sur la façon de le faire de manière portable?

Merci.

Répondre

3

Alors bravo à Bryan pour m'avoir conduit sur le chemin, même si sa réponse n'était pas tout à fait juste.

Il s'avère que parce que je crée la base de données en tant que "footable" puis, comme l'indique Bryan, il créera une casse sensible. Cependant, quand je l'ai fait la sélection sur footable (sans guillemets) Derby et Hsqldb font la promotion à être en majuscules, donc je suis en effet faire:

SELECT * FROM FOOTABLE 

Ce n'est pas d'être insensible à la casse sans les guillemets (ce qui aurait fonctionné) mais à propos de la promotion des noms d'entités pour qu'ils soient tous des capitales lorsqu'il n'y a pas de devis et ensuite de correspondance par cas. Je dirais qu'il y avait un bug ici ...

En tout cas, j'ai changé mon Derby et Hsqldb pour mettre en majuscule tous les noms d'entité dans ORMLite et les choses fonctionnent. OMI laid, mais travaillant.

2

Vous devez juste vous assurer que le cas correspond.

Donc, si c'est:

create table "Footable" ("Stuff" varchar (25))

Ensuite, il doit être:

Si le nom de table/colonne

insert into "Footable" ("Stuff") values 'hi mom'

est entre guillemets, le cas est conservé tel quel.

Si le nom de la table/colonne n'est pas entre guillemets, alors Derby le gère comme insensible à la casse.

+0

Merci pour ce Bryan. J'utilisais le même cas dans les instructions CREATE et SELECT donc votre réponse ne semblait pas appropriée au départ. Cependant, je vois maintenant (selon ma réponse ci-dessous) que c'était un problème, juste parce que Derby et Hsqldb faisaient la promotion des noms sans guillemets pour qu'ils soient tous en majuscules. – Gray

Questions connexes