2011-01-11 3 views
4

私は、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です。

答えて

3

私は同様の問題を抱えており、明示的にjoinTypeを基準に指定して作業していました。

Criteria criteria = session.createCriteria(Payment.class); 
criteria.createAlias("expense", "e", CriteriaSpecification.LEFT_JOIN); 
+0

興味深いことに、私がこのコードに戻ってきたら、これを試してみる必要があります。ありがとう – Josh

+0

はい、結合タイプを指定することは常に良い考えです。 –

関連する問題