Проблемы с экранированием имен таблиц и полей в Derby и Hsqldb - PullRequest
4 голосов
/ 26 июня 2010

У меня проблема с моим пакетом ORMLite .Когда я генерировал схему для таблицы, я думал, что было бы неплохо избегать всех имен сущностей.Это защитит некоторые Java-классы или имена полей от того, чтобы быть зарезервированным словом SQL:

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

Теперь я добавляю поддержку «сырых» запросов, чтобы ORMLite мог помочь пользователям выполнять свои собственные запросы.Однако я обнаружил, что с Derby и Hsqldb имена сущностей не могут использоваться без экранирования .Например, следующий запрос:

SELECT * FROM footable

генерирует следующие ошибки:

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

Работает нормально, если таблица выбора также экранирована как "footable".Другие базы данных, поддерживаемые ORMLite, прекрасно работают с выходом или без него: MySQL, Postgres, Microsoft SQL Server, H2 и Sqlite.

Есть ли лучшие способы избежать зарезервированных слов в Derby и Hsqldb?Другие идеи о том, как сделать это портативным способом?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 26 июня 2010

Так что спасибо Брайану за то, что он вел меня по пути, хотя его ответ был не совсем верным.

Оказывается, поскольку я создаю базу данных как "footable", тогда, как утверждает Брайан, она будетсоздать дело чутко.Тем не менее, когда я сделал выбор в footable ( без кавычек), Дерби и Hsqldb выдвинули его в верхнем регистре, поэтому я в действительности делаю:

SELECT * FROM FOOTABLE

Это не тако нечувствительности к регистру без кавычек (что сработало бы), но о том, что имена сущностей должны быть прописными, когда нет кавычек, а затем сопоставление по регистру.Я бы сказал, что здесь была ошибка ...

В любом случае я изменил свои Derby и Hsqldb, чтобы они стали прописными для всех имен сущностей в ORMLite , и все работает.Уродливый ИМО, но работает.

2 голосов
/ 26 июня 2010

Вы просто должны убедиться, что регистр совпадает.

Так что, если это:

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

Тогда это должно быть:

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

Если имя таблицы / столбца в двойных кавычках, регистр сохраняется как есть.

Если имя таблицы / столбца не в двойных кавычках, тогда Derby обрабатывает его без учета регистра.

...