0

コード

QueryBuilder<MyClass, String> builder = mnDao.queryBuilder();
builder.where().eq("`GROUP`", someGroup));

例外をスローします

「テーブル MyClassTable の不明な列名 '`GROUP`'」

UpdateBuilder から escapeColumnName() を使用しようとしましたが、結果は同じです。生のクエリを使用できますが、プレースホルダーが提供されないため、安全ではありません。

データベースはH2です。

ormliteのバグのようです。助言がありますか?

4

2 に答える 2

2

私はormliteを知りません.奇妙なテーブル名を使用できるように名前を引用する方法が必要ですが、この種の最も簡単な修正は、SQLキーワードをテーブル名または列として使用しないことです.名前。

テーブル名をSQLが他のものに使用しないものに変更できれば、おそらくうまくいくでしょう。

于 2012-07-07T21:02:48.960 に答える
2

正しい答えは、まったく引用しないことです。 ORMLiteは、すべてのフィールド名とテーブル名を自動的に引用符で囲みます。これは確かにデータベースに大きく依存しますが、H2 は私の主要なテスト データベースであるため、私が知っているすべてのケースでうまく機能すると確信しています。なぜそれがうまくいかなかったのかについては、コメントできません。ORMLite によって生成されたクエリを投稿すると、問題が発生する可能性があります。

推奨されるパターンは、クエリで使用されるすべての列をパブリック文字列として定義することです。例えば:

protected static class Reserved {
    public static final String FIELD_NAME_GROUP = "group";
    ...
    @DatabaseField(columnName = FIELD_NAME_GROUP)
    String group;
    ...
}

次に、クエリを実行するときに、FIELD_NAME_GROUP引用符なしでを使用して、次のようにします。

QueryBuilder<Reserved, Integer> sb = dao.queryBuilder();
sb.where().eq(Reserved.FIELD_NAME_GROUP, "something");
...

いくつかの単体テストでこれを十分にカバーしています。サポートされているすべてのデータベース タイプで実行した次のテストを参照してください。JdbcBaseDaoImplTest.java 単体テストtestCreateReserverdTable()testCreateReserverdFields()メソッドとそれらに関連付けられたクラスを探します。

于 2012-07-09T14:47:56.237 に答える