我在我的Role类上有这个字段声明:
@OneToMany(mappedBy = "role")
private Set<User> users;
我的查询是这样的:
"SELECT r FROM Role r LEFT JOIN FETCH r.users u"
然而,用户元素大小总是返回1(不正确的结果),它应该多于一个。
但是,当我将用户字段注释为@LazyCollection(LazyCollectionOption.FALSE)
并在查询中删除FETCH
时,它会返回收集结果。
我知道为什么我不能在查询中使用FETCH
来运行它?我不想依靠@LazyCollection(LazyCollectionOption.FALSE)
,因为每次打电话都很昂贵。
更新 我最初的解决方法是在我的DAO上迭代返回列表并在每个上调用getUsers(使用此解决方法,我也能够检索正确的计数结果)。
public List<Role> getRoles(){
Query query = session.createQuery("SELECT r FROM Role r LEFT JOIN FETCH r.users u");
List<Role> results = query.list();
for (Role item: results){
log.info("size is {}", item.getUsers().size());
}
}
明天会发布更多代码片段对于overriden equals和hashCode,我使用IntelliJ IDEA生成的那个,只选择要包含的唯一字段。
答案 0 :(得分:0)
确保所有实体都使用implement properly the equals/hashCode种方法。
LEFT JOIN FETCH应该与LAZY = false做同样的事情。即使有额外的选择,您仍然会初始化Users集合。