hql - 查询时的LazyCollectionOption.FALSE

时间:2014-08-18 05:23:41

标签: hibernate hql lazy-initialization

我在我的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生成的那个,只选择要包含的唯一字段。

1 个答案:

答案 0 :(得分:0)

  1. 确保所有实体都使用implement properly the equals/hashCode种方法。

  2. LEFT JOIN FETCH应该与LAZY = false做同样的事情。即使有额外的选择,您仍然会初始化Users集合。