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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值