public CorePage<T> findByHql(CorePage<T> page, String hql) { Assert.notNull(page, "分页对象page为NULL!"); Assert.notNull(hql, "hql语句为NULL!"); Query query = this.getSession().createQuery(this.createOrderByHqlPage(page, hql)); int total = this.countByHql(this.delOrderByhql(hql)); int pageNo = page.getPageNo(); int pageSize = page.getPageSize(); query.setFirstResult((pageNo - 1) * pageSize); boolean isGroup = hql.indexOf("group by ") != -1; if (isGroup) { query.setMaxResults(total); } else { query.setMaxResults(pageSize); } List<T> rows = query.list(); page.setTotal(total); page.setRows(rows); int pageTotal = (total - 1) / pageSize + 1; page.setPageTotal(pageTotal); return page; }
时间: 2024-04-19 22:30:00 浏览: 115
利用SQL语句实现分页查询
这段代码是一个方法 `findByHql` 的实现,它接受一个 `CorePage<T>` 类型的分页对象 `page` 和一个 HQL 查询语句 `hql` 作为参数。
首先,代码通过断言(`Assert.notNull`)确保传入的 `page` 和 `hql` 不为空。
接下来,通过调用 `getSession()` 方法获取当前会话的 `Query` 对象,该对象用于执行查询操作。`createOrderByHqlPage` 方法用来创建带有排序和分页信息的 HQL 查询语句。
然后,代码调用 `countByHql` 方法计算满足条件的记录总数,以便进行分页处理。
接着,根据分页信息设置查询的起始位置(`setFirstResult`)和最大结果数(`setMaxResults`),以实现分页查询。
根据 HQL 查询语句是否包含 "group by" 子句,决定设置最大结果数为总记录数还是每页显示的数据量。
执行查询并将结果存储在 `List<T>` 类型的变量 `rows` 中。
然后,将查询结果设置到分页对象 `page` 中,包括总记录数、当前页的数据列表、总页数等信息。
最后,返回更新后的分页对象 `page`。
总体上,这段代码实现了通过 HQL 查询语句进行分页查询,并将查询结果封装到分页对象中返回。
阅读全文