5

initialFieldsというフィールドを持つドメイン オブジェクト Expense があります。

次のように注釈が付けられています。

@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();

デバッグをオンにして show 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 です。

4

1 に答える 1

3

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

Criteria criteria = session.createCriteria(Payment.class);
criteria.createAlias("expense", "e", CriteriaSpecification.LEFT_JOIN);
于 2011-03-16T14:17:02.060 に答える