我正在使用条件来选择具有引用其他表的字段的实体列表,因此我使用别名。问题是,当我尝试访问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
}
答案 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个语句。