4

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で予約語をエスケープするためのより良い方法はありますか?ポータブルな方法でこれを行う方法に関する他のアイデアはありますか?

ありがとう。

4

2 に答える 2

3

それで、彼の答えは完全には正しくありませんでしたが、私を道に導いてくれたブライアンに称賛を送ります。

ブライアンが述べているように、私はその時点でデータベースを作成しているので、"footable"大文字と小文字を区別して作成することがわかりました。ただし、footable(引用符なしで)選択を行ったとき、DerbyとHsqldbはそれをすべて大文字にプロモートしているので、実際には次のことを行っています。

SELECT * FROM FOOTABLE

これは、引用符なしで大文字と小文字を区別しないこと(これは機能します)ではなく、引用符がない場合にエンティティ名をすべて大文字に昇格させ、大文字と小文字を区別することです。ここにバグがあったと思います...

いずれにせよ、DerbyとHsqldbを変更して、ORMLiteのすべてのエンティティ名を大文字にすると、問題なく動作します。醜いIMOですが、機能しています。

于 2010-06-25T20:54:43.747 に答える
2

ケースが一致することを確認する必要があります。

したがって、次の場合:

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

次に、次のようにする必要があります。

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

テーブル/列名が二重引用符で囲まれている場合、大文字と小文字はそのまま保持されます。

テーブル/列名が二重引用符で囲まれていない場合、Derbyは大文字と小文字を区別せずに処理します。

于 2010-06-25T20:33:49.080 に答える