jas*_*ace 8 hibernate criteria
使用hibernate ctiteria我想选择一个对象,它与oneToMany对象列表相关联.我想通过这个列表分页,避免可怕的hibernate 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();
Run Code Online (Sandbox Code Playgroud)
这里是一个只执行一个sql语句(hurray)但不能处理分页的解决方案,即父对象上的setMaxResults和setFirstResult不正确Mother(boo)
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();
Run Code Online (Sandbox Code Playgroud)
这似乎是一个常见的要求,但我已经挖掘出一个没有运气的解决方案.
任何接受者?
mer*_*ike 15
将其归结为1个查询很困难(即我不知道可移植的解决方案),但将其归结为2个查询(无论n)都非常简单:
Criteria criteria = this.getSession().createCriteria(Mother.class);
criteria.addOrder(Order.asc("title"))
.setMaxResults(details.getMaxRows())
.setFirstResult(details.getStartResult())
.setProjection(Projections.id());
List<?> ids = criteria.list();
criteria = getSession().createCriteria(Mother.class)
.add(Restrictions.in("id", ids))
.setFetchMode("children", FetchMode.JOIN)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
return criteria.list();
Run Code Online (Sandbox Code Playgroud)
对于某些数据库,子选择提取children也可能有效.
| 归档时间: |
|
| 查看次数: |
3586 次 |
| 最近记录: |