`

Hiberrnate 分页

阅读更多
public interface Page<T> {

    /**
     * @return 是否是首页(第一页),第一页页码为1
     */
    public boolean isFirst();

    /**
     * @return 是否是最后一页
     */
    public boolean isLast();

    /**
     * @return 是否有下一页
     */
    public boolean hasNext();

    /**
     * @return 是否有上一页
     */
    public boolean hasPrevious();


    /**
     * @return 当前页的数据内容
     */
    public List<T> getThisPageElements();

    /**
     * @return 数据总的条目数量
     */
    public int getTotalNumberOfElements();

    /**
     * @return 当前页的首条数据的行编码
     */
    public int getFirstElementNumber();

    /**
     * @return 当前页的末条数据的行编码
     */
    public int getLastElementNumber();

    /**
     * @return 当前页编码
     */
    public int getPageNumber();

    /**
     * @return 下一页编码
     */
    public int getNextPageNumber();

    /**
     * @return 上一页编码
     */
    public int getPreviousPageNumber();

    /**
     * @return 获取最后一页页码,也就是总页数
     */
    public int getLastPageNumber();

    /**
     * @return 每一页显示的条目数
     */
    public int getPageSize();
}

 

 

基于Hibernate的实现:

public class HibernatePage<T> implements Page<T> {

    private List<T> elements;
    private int pageSize;
    private int pageNumber;
    private int totalElements = 0;

    /**
     * 构建HibernatePage对象,完成Hibernate的Query数据的分页处理
     *
     * @param query
     *            Hibernate的Query对象
     * @param pageNumber
     *            当前页编码,从1开始,如果传的值为Integer.MAX_VALUE表示获取最后一页。
     *            如果你不知道最后一页编码,传Integer.MAX_VALUE即可。如果当前页超过总页数,也表示最后一页。
     *            这两种情况将重新更改当前页的页码,为最后一页编码。
     * @param pageSize
     *            每一页显示的条目数
     */
    public HibernatePage(Query query, int pageNumber, int pageSize) {
        this.pageNumber = pageNumber;
        this.pageSize = pageSize;
        try {
            ScrollableResults scrollableResults = query.scroll();
            // get the total elements number
            scrollableResults.last();
            this.totalElements = scrollableResults.getRowNumber();
            if (Integer.MAX_VALUE == this.pageNumber || this.pageNumber > getLastPageNumber()) // last page
            {
                this.pageNumber = getLastPageNumber();
            }
            elements = query.setFirstResult(
                    (this.pageNumber - 1) * this.pageSize).setMaxResults(
                    this.pageSize + 1).list();
        } catch (HibernateException e) {
            throw new RuntimeException(e);
        }
    }

    public boolean isFirst() {
        return getPageNumber() == 1;
    }

    public boolean isLast() {
        return getPageNumber() >= getLastPageNumber();
    }

    public boolean hasNext() {
        return getLastPageNumber() > getPageNumber();
    }

    public boolean hasPrevious() {
        return getPageNumber() > 1;
    }

    public int getLastPageNumber() {
        return totalElements % this.pageSize == 0 ? totalElements / this.pageSize : totalElements / this.pageSize + 1;
    }

    /**
     * 返回List类型数据
     *
     * @return List数据源
     */
    public List<T> getThisPageElements() {
        return elements;
    }

    public int getTotalNumberOfElements() {
        return totalElements;
    }

    public int getFirstElementNumber() {
        return (getPageNumber() - 1) * getPageSize() + 1;
    }

    public int getLastElementNumber() {
        int fullPage = getFirstElementNumber() + getPageSize() - 1;
        return getTotalNumberOfElements() < fullPage ? getTotalNumberOfElements()
                : fullPage;
    }

    public int getNextPageNumber() {
        return getPageNumber() + 1;
    }

    public int getPreviousPageNumber() {
        return getPageNumber() - 1;
    }

    public int getPageSize() {
        return pageSize;
    }

    public int getPageNumber() {
        return pageNumber;
    }
}

 

 

基于JPA的实现:

public class JPAPage<T> implements Page<T> {

    private List<T> elements;
    private Integer pageSize;
    private Integer pageNumber;
    private Integer totalElements = 0;

    /**
     * 构建JPAPage对象,完成JPAPage的Query数据的分页处理
     *
     * @param countQuery
     *            Hibernate的查询总数的Query对象
     * @param pageNumber
     *            当前页编码
     * @param pageSize
     *            每一页显示的条目数
     * @param dataQuery
     *            Hibernate的查询结果的Query对象
     */
    public JPAPage(Query countQuery, int pageNumber, int pageSize,
            Query dataQuery) {
        // 设置
        this.pageSize = pageSize;
        this.pageNumber = pageNumber;
        // 验证
        if (this.pageNumber < 1) {
            this.pageNumber = 1;
        }
        if (Integer.MAX_VALUE == this.pageNumber || this.pageNumber > getLastPageNumber()) // last page
        {
            this.pageNumber = getLastPageNumber();
        }
        // 注入数据
        try {
            Object obj = countQuery.getSingleResult();
            if (obj != null && obj instanceof Long) {
                this.totalElements = ((Long) obj).intValue();
            } else {
                throw new NumberFormatException("[countQuery is error.]");
            }

            elements = dataQuery.setFirstResult(
                    (this.pageNumber - 1) * this.pageSize).setMaxResults(
                    this.pageSize + 1).getResultList();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public boolean isFirst() {
        return getPageNumber() == 1;
    }

    public boolean isLast() {
        return getPageNumber() >= getLastPageNumber();
    }

    public boolean hasNext() {
        return getLastPageNumber() > getPageNumber();
    }

    public boolean hasPrevious() {
        return getPageNumber() > 1;
    }

    public int getLastPageNumber() {
        return totalElements % this.pageSize == 0 ? totalElements / this.pageSize : totalElements / this.pageSize + 1;
    }

    /**
     * 返回List类型数据
     *
     * @return List数据源
     */
    public List<T> getThisPageElements() {
        return elements;
    }

    public int getTotalNumberOfElements() {
        return totalElements + 1;
    }

    public int getFirstElementNumber() {
        return (getPageNumber() - 1) * getPageSize() + 1;
    }

    public int getLastElementNumber() {
        int fullPage = getFirstElementNumber() + getPageSize() - 1;
        return getTotalNumberOfElements() < fullPage ? getTotalNumberOfElements()
                : fullPage;
    }

    public int getNextPageNumber() {
        return getPageNumber() + 1;
    }

    public int getPreviousPageNumber() {
        return getPageNumber() - 1;
    }

    public int getPageSize() {
        return pageSize;
    }

    public int getPageNumber() {
        return pageNumber;
    }
}

 

同样,基于JDBC的实现或者其他什么数据结构查询的实现都很简单。使用Freemarker/Velocity分页宏编写也很容易。

这个分页虽然粗糙,但是一般的应用足够了,不过在排序方面还有待改进。

 

分享到:
评论

相关推荐

    超强php分页打包 通用分页 万能分页 ajax分页 google分页

    本压缩包“超强php分页打包 通用分页 万能分页 ajax分页 google分页”提供了一系列的分页解决方案,包括了基本的PHP分页、通用的分页实现、以及结合AJAX技术的动态分页,旨在满足各种项目需求。下面将详细介绍这些...

    用recyclerview实现分页滑动,横向纵向分页

    本教程将深入讲解如何利用RecyclerView实现横向和纵向的分页滑动,充分利用Android原生功能。 首先,理解RecyclerView的基本结构。RecyclerView包含一个Adapter,它负责将数据集绑定到视图上,以及一个...

    Java Ajax分页,jsp ajax分页

    在网页开发中,分页是一种常见的用户界面设计,用于处理大量数据时的高效展示。Java AJAX(Asynchronous JavaScript and XML)分页与JSP(JavaServer Pages)相结合,可以提供无需刷新整个页面即可动态加载更多内容...

    分页插件.zip

    在网页开发中,分页是不可或缺的一个功能,特别是在数据量庞大的时候,为了提高用户体验,将大量数据分成多个页面展示,而不是一次性加载所有内容。本文将详细介绍一个基于jQuery的分页插件,它具有代码简洁、兼容性...

    js分页示例,前台分页,客户端分页,分页机制,js分页

    本篇将深入探讨JavaScript实现分页的相关知识点,包括前台分页、客户端分页、分页机制以及相关的JavaScript代码示例。 首先,我们要理解什么是分页。在Web应用中,分页是将大量数据分成多个小部分(每部分通常称为...

    WPF 分页DataGrid 分页控件的实现

    在Windows Presentation Foundation (WPF) 中,开发人员经常需要处理大量的数据展示,此时分页功能就显得尤为重要。WPF DataGrid 控件是一个强大的表格展示工具,它可以方便地展示和操作数据,而添加分页功能则可以...

    java实现分页 jsp分页 分页

    java实现分页 jsp分页 分页java实现分页 jsp分页 分页java实现分页 jsp分页 分页java实现分页 jsp分页 分页java实现分页 jsp分页 分页java实现分页 jsp分页 分页

    分页代码 分页代码 分页代码

    分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码...

    QTableWidget,QTableView分页的分页栏

    为了解决这个问题,我们可以实现分页功能,让数据分批次加载,从而提高界面响应速度。本文将深入探讨如何在`QTableWidget`和`QTableView`中实现分页栏。 首先,我们需要理解`QTableWidget`和`QTableView`的区别。`...

    分页:高度自定义分页

    2.1.目前网络上很多分页主键,不能进行按钮选择, 2.2.甚至对样式修改的难度也较大, 2.3.使用在开发过程中由于使用到了分页功能,在这里写了一个分页功能。 3.按钮选择 之前的很多按钮是通过参数进行选择,这样不...

    mysql数据库实现分页

    在MySQL数据库中,分页是处理大量数据查询时不可或缺的一种技术。它允许用户按需加载数据,而不是一次性获取所有记录,从而提高了用户体验并降低了服务器负载。以下是对分页实现的详细说明: 一、基础概念 分页是将...

    asp分页,asp分页仿百度,asp分页大全

    在ASP中实现分页功能是常见的需求,特别是在处理大量数据列表时,分页能够提高用户体验,避免一次性加载过多内容导致页面加载缓慢。下面将详细探讨ASP分页的相关知识点。 一、分页的基本原理 分页主要是通过计算总...

    能用漂亮分页控件及Demo源码

    AspNetPager除提供默认的类似于DataGrid和GridView的PostBack分页方式外,还支持通过Url进行分页,象大多数asp程序中分页一样, Url分页方式允许用户通过在浏览器地址栏中输入相应的地址即可直接进入指定页面,也...

    jquery分页,最简单分页,完整分页案例,50种分页样式

    **jQuery分页插件及其应用** 在Web开发中,数据量较大的时候,为了提高用户体验,通常会采用分页的方式来展示信息。jQuery分页插件因其轻量级、易用性而受到开发者们的广泛喜爱。本资源包含“最简单分页”至“50种...

    各数据库分页语法支持

    ### 各数据库分页语法支持 #### 概述 在数据库操作中,分页查询是一项非常常见的需求。分页能够帮助我们有效地管理大量的数据记录,提高数据查询的效率和用户体验。不同的数据库系统提供了不同的分页机制,本文将...

    java 通用分页 java 通用分页

    Java 通用分页详解 Java 通用分页是指在Java编程中对大量数据进行分页处理,以提高系统效率和性能。下面对Java通用分页的知识点进行详细说明: 1. 分页的必要性 在实际项目中,数据量可能非常大,直接查询所有...

    java分页标签自定义分页标签自定义分页标签

    自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签...

    关于Mysql分页的两种方法,假分页和limit分页

    在MySQL数据库中,分页是实现大量数据查询时不可或缺的功能,它可以帮助用户按需加载数据,提高网页加载速度,减少服务器资源消耗。本篇文章将详细探讨两种常见的分页方法:假分页和LIMIT分页。 首先,我们来理解...

    java_swing表格分页

    Java Swing 表格分页实现 Java Swing 是一个用于构建图形用户界面的 Java 库,提供了丰富的用户界面组件和功能。在本文中,我们将探讨如何使用 Java Swing 实现表格分页。 表格分页的需求 在实际开发中,我们经常...

    使用jquery实现表格动态分页

    在网页开发中,数据展示是不可或缺的一部分,而大型数据集的处理往往需要用到分页功能,以便用户能够更高效地浏览和查找信息。本教程将详细讲解如何使用jQuery库来实现表格的动态分页,同时结合Java后端进行数据的...

Global site tag (gtag.js) - Google Analytics