hibernate多表连接查询,主表分页的实现

  1. 第一步:查询数据的总数

    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();

  2. 第二步:查询满足条件的id的列表信息,加上分页

            idsOnlyCriteria.setProjection(Projections.distinct(Projections.id()));
            idsOnlyCriteria.addOrder(Order.asc("c.id"));
            List<Long> idList = idsOnlyCriteria.getExecutableCriteria(s)
                    .setFirstResult(0).setMaxResults(3).list();

  3. 第三步:重新构建查询语句,使用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"));

  4. 第四步:保证Distinct,让hibernate自动封装返回的数据到各个字段中

    criteria.setResultTransformer(DetachedCriteria.DISTINCT_ROOT_ENTITY);
            List<Category> resultList = criteria.list();

  5. 结果

            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,分页,多表查询)