7

@WhereHibernateでアノテーションを使用して、そのオブジェクトのブールプロパティによって「削除済み」とマークされたオブジェクトを削除したいと思います。たとえば、次のようにして、削除されたアドレスがHibernateによってロードされないようにする必要があります。

@OneToMany(mappedBy="contact")
@Where(clause="deleted=FALSE")
private Set<Address> addresses; 

ただし、このような句を使用するとdeleted=FALSE、Hibernateはブールリテラルの前にテーブル名を付けることでブールリテラルをマングルし、クエリが失敗します。例えば:

select ... from address address0_ where  ( address0_.deleted=address0_.FALSE)  and address0_.contact_id=?

私が期待したのは、の(address0_.deleted=FALSE)代わりのようなものです(address0_.deleted=address0_.FALSE)

@Where句を指定したり、ブール値を正しく出力するようにHibernateを構成したりする方法はありますか?


PS。一部のデータベースでは、ブール値を次のような文字列リテラルとして指定できることに注意してください。

@Where(clause="deleted='FALSE'")

(address0_.deleted='FALSE')これは、たとえばPostgreSQLで問題なく機能するものに変換されます。ただし、このプロジェクトではHSQLDBを使用しており、HSQLDBは​​ブール文字列リテラルをサポートしていないようです。HSQLで使用すると、次の例外が発生しdeleted='FALSE'ます。

org.hsqldb.HsqlException: data exception: invalid character value for cast

4

2 に答える 2

5

これに関するバグレポートを発見しましたが、6年以上解決されていません。Hibernate Issue Trackerには、問題に関するHHH-1587HHH-2775、およびANN-647があります。

true解決策は、falseをキーワードとして登録するカスタムDialectクラスを作成することですunknown(これらはSQL仕様の公式ブールリテラルです)。これにより、Hibernateはそれらをキーワードとして認識し、列であるかのようにプレフィックスを付けるのを停止します。

これが私の問題を解決した私のカスタム方言クラスです:

public class ImprovedHSQLDialect extends HSQLDialect {

    public ImprovedHSQLDialect() {
        super();
        registerKeyword("true");
        registerKeyword("false");
        registerKeyword("unknown");
    }
}

この方言が使用されると、@Where(clause="deleted=FALSE")正しく機能します。

于 2012-05-24T05:07:08.157 に答える
2

テーブル定義で列がBOOLEANとして作成される場合、最新のHSQLDBは​​、およびをサポートWHERE active = TRUEWHERE active = 'TRUE'ますWHERE active

HibernateはBIT列を作成している可能性があり、その場合WHERE active = TRUEWHERE active = B'1'または機能しWHERE active = 1ます。

これらの機能には、バージョン2.2.8以降を使用してください。

于 2012-05-24T10:00:36.830 に答える