- 第一步:查询数据的总数
Session s = HibernateSessionFactory.getSession();
DetachedCriteria idsOnlyCriteria = DetachedCriteria.forClass(
Category.class, "c");
//hibernate多表连接查询,主表分页的实现。
idsOnlyCriteria.createAlias("products", "p");
idsOnlyCriteria.add(Restrictions.gt("p.createTime", DateUtils.parse(
"2013-04-20 08:53:28", DateUtils.DATE_FMT_STR)));
idsOnlyCriteria.setProjection(Projections.countDistinct("id"));
int total = ((Number) idsOnlyCriteria.getExecutableCriteria(s).list()
.get(0)).intValue(); - 第二步:查询满足条件的id的列表信息,加上分页
idsOnlyCriteria.setProjection(Projections.distinct(Projections.id()));
idsOnlyCriteria.addOrder(Order.asc("c.id"));
List<Long> idList = idsOnlyCriteria.getExecutableCriteria(s)
.setFirstResult(0).setMaxResults(3).list(); - 第三步:重新构建查询语句,使用in进行查询
Criteria criteria = s.createCriteria(Category.class, "c");
criteria.createAlias("products", "p");
criteria.add(Restrictions.gt("p.createTime", DateUtils.parse(
"2013-04-20 08:53:28", DateUtils.DATE_FMT_STR)));
criteria.add(Restrictions.in("c.id", idList));
criteria.setFetchMode("products", FetchMode.JOIN);
criteria.addOrder(Order.asc("c.id")); - 第四步:保证Distinct,让hibernate自动封装返回的数据到各个字段中
criteria.setResultTransformer(DetachedCriteria.DISTINCT_ROOT_ENTITY);
List<Category> resultList = criteria.list(); -
结果
for (Category category : resultList) {
Set<Food> set = category.getProducts();
System.out.println("categoryID="+category.getId()+","+category.getName());
for (Food food : set) {
System.out.println("------" + food.getName());
}
}
hibernate多表连接查询,主表分页的实现
最新推荐文章于 2021-01-25 23:18:49 发布