私は、initialFieldsというフィールドを持つドメインオブジェクトExpenseを持っています。@OneToManyマッピングのクエリを実行していない投影によるHibernateの基準
それはそうと注釈を付けています:
@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinTable(blah blah)
private final List<Field> initialFields;
は今、私は唯一のために、プロジェクションを使用しようとしているが、パフォーマンス上の理由から特定のフィールドを引くが、そうするときinitialFieldsフィールドは常にnullです。これは唯一のOneToManyフィールドで、このように動作している投影を取得しようとしている唯一のフィールドです。通常のHQLクエリを使用する場合、initialFieldsには適切な値が設定されますが、もちろんフィールドを制限することはできません。
部分投影コード:
Criteria criteria = session.createCriteria(Payment.class);
criteria.createAlias("expense", "e");
ProjectionList properties = Projections.projectionList();
//Some restrictions and more fields
properties.add(Projections.property("e.initialFields"), "initialFields");
criteria.setProjection(properties);
criteria.setFetchMode("e.initialFields", FetchMode.JOIN);
criteria.setReadOnly(true);
criteria.setResultTransformer(Transformers.aliasToBean(Expense.class));
return criteria.list();
私はデバッグをオンにし、SQL表示をオンにすると、initialFieldsを引くために、クエリが実行/作成されていないよう。誰もこれのようなものを見たことがありますか?
私は、HQLプロジェクションを使用しようとしましたが、プルしたい各フィールドを指定し、手動でオブジェクトを構築しました。この場合、Hibernateによって構築されたSQLは、initialFieldsフィールドに対して正しくありません。 expense1_.name as col_1_0_, . as col_2_0_, expense1_.account_id as col_3_0_
。 initialFieldsが引き出される. as col_2_0_ is
。私の推測では、それはexpense1_.id as col_2_0_
でなければならないということです。
編集:各プロパティを検査するためにResult Transformerを削除しましたが、initialFieldsプロパティは実際にはnullです。
興味深いことに、私がこのコードに戻ってきたら、これを試してみる必要があります。ありがとう – Josh
はい、結合タイプを指定することは常に良い考えです。 –