2

私はこうして構築する Hibernate Criteria オブジェクトを持っています:

Criteria obsCriteria = hibernateTemplate.getSessionFactory()
  .getCurrentSession().createCriteria(Observation.class);

ProjectionList projection = Projections.projectionList()
  .add(Projections.rowCount())
  .add(Projections.avg("value").as("avgScore"))
  .add(Projections.avg("type.score"))
  .add(Projections.max("date"))
  .add(Projections.groupProperty("observedSubject"));
criteria.setProjection(projection);

これで正しい結果が得られますが、「observedSubject」プロパティはエンティティです。set show_sql を true に設定すると、最初のクエリ (18 行が返された) の後に、observedSubject エンティティを取得するために 18 の選択があることがわかりました。私はもう試した:

criteria.setFetchMode("observedSubject", FetchMode.JOIN);

しかし、それはうまくいきませんでした。暗闇の中での刺し傷のようなものとして、私は試しました:

criteria.createAlias("observedSubject", "observedSubject", Criteria.FULL_JOIN);

しかし、それもうまくいきませんでした。この動作を防ぐ方法はありますか?

4

1 に答える 1

0

に注釈observedSubjectを付けましたFetchType.LAZYか? そうでない場合、Hibernate はデフォルトの動作 (EAGERフェッチ) に戻ります。

実行時に子アソシエーションを取得しSELECTたいが、アソシエーションごとに個別の呼び出しを行いたくない場合は、アソシエーションを設定@BatchSizeすると、Hibernate が呼び出しをバッチ処理してSELECT効率を高めます。

于 2011-07-24T13:48:06.020 に答える