防止Hibernate N + 1按实体分组时选择

时间:2010-12-02 00:14:09

标签: hibernate criteria-api hibernate-criteria

我有一个我建立的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_sset设置为true时,我看到在第一次查询(返回18行)之后,有18个选择来获取observeSubject实体。我试过了:

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

但那没用。作为黑暗中的一种刺,我试过了:

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

但这也行不通。有没有办法阻止这种行为?

1 个答案:

答案 0 :(得分:0)

您是否注释了observedSubjectFetchType.LAZY?如果没有,Hibernate将恢复为默认行为,即EAGER获取。

如果您希望在运行时获取子关联,但您不希望对每个关联进行单独的SELECT调用,请在关联上设置@BatchSize并且Hibernate将批量调用SELECT,提高效率。