【发布时间】:2011-07-30 21:05:53
【问题描述】:
使用 hibernate ctiteria 我想选择一个对象,它与 oneToMany 对象列表相关联。我想通过这个列表分页避免可怕的休眠 n+1 选择问题
这是一个可行的解决方案,它需要 11 次访问数据库以获取 10 个父对象。
Criteria criteria = this.getSession().createCriteria(Mother.class);
criteria.addOrder(Order.asc("title"))
.setMaxResults(details.getMaxRows())
.setFirstResult(details.getStartResult())
.setFetchMode("kittens", FetchMode.SELECT);
List test = criteria.list();
这是一个解决方案,它只执行一个 sql 语句(欢呼)但无法处理分页,即父对象 Mother 上的 setMaxResults 和 setFirstResult 不正确(嘘)
Criteria criteria = this.getSession().createCriteria(Mother.class);
criteria.addOrder(Order.asc("title"))
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.setMaxResults(details.getMaxRows())
.setFirstResult(details.getStartResult())
.setFetchMode("kittens", FetchMode.JOIN);
List test = criteria.list();
这似乎是一个常见的要求,但我一直在寻找一个没有运气的解决方案。
有接受者吗?
【问题讨论】: