Hibernate条件访问连接的字段

时间:2016-12-07 09:25:16

标签: java hibernate join criteria

我正在使用条件来选择具有引用其他表的字段的实体列表,因此我使用别名。问题是,当我尝试访问join字段时,hibernate执行另一个select到数据库。这实际上是无效的,因为这是为每个结果行执行一个查询。

有谁能告诉我为什么会这样?

使用标准(仅限于相关行)

List<Country> list = session.createCriteria(Country.class)
    .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
    .createAlias("locations", "location")
    .list();

for (Countries cntry : list){
    cntry.getLocations().size(); // here hibernate execute another query
}

国家/地区(重要部分)

@Entity
public class Country {

    // other fields as uuid etc.

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "country")
    private List<Location> locations;

    // getters and setters
}

位置(重要部分)

@Entity
public class Location {

    // other fields as uuid etc.

      @ManyToOne(fetch = FetchType.LAZY)
      @JoinColumn(name = "COUNTRY_UUID")
      private Country country;

    // getters and setters
}

1 个答案:

答案 0 :(得分:1)

尝试:

List<Country> list = session.createCriteria(Country.class)
    .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
    .setFetchMode("locations", FetchMode.JOIN)
    .createAlias("locations", "location")
    .list();

这应该会产生一个提取所有国家和地区的查询。

除此之外,你应该在位置上有@BatchSize。如果您没有设置获取模式,@ BatchSize(size = 20)将为每20个关系生成1个语句。