3

状況: オブジェクト Subject をラップするオブジェクトSubjectRowあります(オブジェクト Subject は永続化可能なエンティティです)。HQL で直接新しいラッパー オブジェクトを作成する必要があります。

public class SubjectRow{
    Subject subject;
    String myString;
    boolean myBoolean;

    public SubjectRow(SubjectSch subject, String myString) {
        this.subject = subject;
        this.myString = myString;
    }

    public SubjectRow(SubjectSch subject, boolean myBoolean) {
        this.subject = subject;
        this.myBoolean = myBoolean;
    }


}

文字列を持つコンストラクターの HQL (そして、本来のように動作します):

SELECT new package.SubjectRow(s, 'myString') FROM Subject s

問題。文字列の代わりにブール値を受け入れるこのラッパーの別のコンストラクターを呼び出す必要がある場合があるという問題。私は同じアプローチを試みました

SELECT new package.SubjectRow(s, true) FROM Subject s

しかし、Hibernate はクラス SubjectRow に適切なコンストラクターが見つからないと文句を言います。もちろん、文字列を渡してから適切なキャストを行うこともできますが、それはあまりにも醜いです。

質問: HQL および/またはコンストラクターを変更して、このブール値パラメーターを直接渡すにはどうすればよいですか (代わりにブール値を使用することは可能です)?

「解決策」 . ブール値を正しく渡す方法を見つけることができなかったため、ドメイン オブジェクトを少し作り直す必要があります。このブール型プロパティを SubjectRow から削除し、代わりに元のオブジェクトの子である SubjectRowFalse および SubjectRowTrue クラスを作成します。そして今、2つのHQLを使用しています

SELECT new package.SubjectRowTrue(s) FROM Subject s

SELECT new package.SubjectRowFalse(s) FROM Subject s

もちろん、これは単なる回避策であり、元の問題の解決策ではありません

4

1 に答える 1

0

100% 確信があるわけではありませんが、ブール型プリミティブの代わりにブール型オブジェクトを使用する必要があるかもしれないと思います。

于 2012-04-19T15:20:27.387 に答える