状況: オブジェクト 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
もちろん、これは単なる回避策であり、元の問題の解決策ではありません