質問

私はドメインオブジェクト、費用を持っています、それは呼ばれるフィールドを持っています 初期フィールド.

そのように注釈が付けられています:

@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinTable(blah blah)
private final List<Field> initialFields;

今、私はパフォーマンス上の理由で特定のフィールドのみを引くためにプロジェクションを使用しようとしていますが、そうする場合、初期フィールドフィールドは常にヌルです。これは唯一の標準分野であり、このように振る舞っている予測で私が取得しようとしている唯一の分野です。通常のHQLクエリを使用すると、初期フィールドが適切に入力されますが、もちろんフィールドを制限することはできません。

部分投影コード:

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を表示すると、初期フィールドを引くためのクエリは作成/実行されていないように見えます。誰かがこのようなものを見たことがありますか?

HQLプロジェクションを使用してみましたが、引きたい各フィールドを指定してから手動でオブジェクトを構築しました。この場合、Hibernateによって構築されたSQLは、InitialFieldsフィールドで正しくありません。 expense1_.name as col_1_0_, . as col_2_0_, expense1_.account_id as col_3_0_. 。 . as col_2_0_ is 初期フィールドが引っ張られる場所。私の推測では、そうあるべきだと思います expense1_.id as col_2_0_.

編集:結果トランスを削除して各プロパティを検査するだけで、InitialFieldsプロパティは実際にnullです。

役に立ちましたか?

解決

私は同様の問題を抱えていました、そして私にとっては明示的に指定していました ジョイントタイプ 基準で。

Criteria criteria = session.createCriteria(Payment.class);
criteria.createAlias("expense", "e", CriteriaSpecification.LEFT_JOIN);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top