`

Selector 和 Paging

 
阅读更多
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;

public class Selector<T> {
    protected final int frist;
    protected final int size;
    protected final Criteria finder;

    /**
     * 创建不可分页的查询器。
     *
     * 当cacheRegion或cacheMode有一个不为null时,开启缓存
     *
     * @param finder 用于查询的Criteria
     */
    public Selector(Criteria finder) {
        this(finder, 0, 0);
    }

    /**
     * 创建可分页的查询器。
     *
     * 当cacheRegion或cacheMode有一个不为null时,开启缓存
     *
     * @param finder 用于查询的Criteria
     * @param frist 返回结果的开始位置,非正数将被忽略
     * @param size 返回结果的数量,非正数将被忽略
     */
    public Selector(Criteria finder, int frist, int size) {
        this.frist = frist;
        this.size = size;
        this.finder = finder;
    }

    /**
     * 添加查询判据
     *
     * @param c
     * @return
     */
    public Selector<T> add(Criterion c) {
        finder.add(c);

        return this;
    }

    /**
     * 添加升序规则
     *
     * @param field 将升序排列的字段名称
     * @return
     */
    public Selector<T> asc(String field) {
        finder.addOrder(Order.asc(field));

        return this;
    }

    /**
     * 添加降序规则
     *
     * @param field 将升将序排列的字段名称
     * @return
     */
    public Selector<T> desc(String field) {
        finder.addOrder(Order.desc(field));

        return this;
    }

    /**
     * 添加别名
     *
     * @param field
     * @param alias
     * @return
     */
    public Selector<T> alias(String field, String alias) {
        finder.createAlias(field, alias);

        return this;
    }

    /**
     * 查询符合条件的数据
     *
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<T> list() {
        if (frist > 0) {
            finder.setFirstResult(frist);
        }
        if (size > 0) {
            finder.setMaxResults(size);
        }
        return finder.list();
    }
}

 

public class PagingSelector<T> extends Selector<T> {
    private Paging paging;
    private Criteria counter;

    public PagingSelector(Criteria counter, Criteria finder, Paging paging) {
        super(finder, paging.getOffset(), paging.getPageSize());
        this.counter = counter;
        this.paging = paging;
    }

    @Override
    public PagingSelector<T> add(Criterion c) {
        counter.add(c);
        finder.add(c);

        return this;
    }

    @Override
    public PagingSelector<T> alias(String field, String alias) {
        counter.createAlias(field, alias);
        finder.createAlias(field, alias);

        return this;
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<T> list() {
        List<T> results = Collections.EMPTY_LIST;

        // 统计数据总数
        int total = ((Number) counter.uniqueResult()).intValue();
        paging.setTotal(total);

        // 总数比偏移量小,不需要执行查询
        if (total > paging.getOffset()) {
            results = finder.setFirstResult(paging.getOffset()).setMaxResults(paging.getPageSize()).list();
        }

        return results;
    }

}

 

public class NativeDynamicSelector extends DynamicSelector {
    public NativeDynamicSelector(SQLQuery counter, SQLQuery finder, Paging paging) {
        super(counter, finder, paging);
    }

    public void addScalar(String columnAlias, Type type) {
        ((SQLQuery) finder).addScalar(columnAlias, type);
    }

    public void setResultTransformer(ResultTransformer transformer) {
        ((SQLQuery) finder).setResultTransformer(transformer);
    }

    public void addEntity(Class<?> clazz) {
        ((SQLQuery) finder).addEntity(clazz);
    }

    public void addEntity(String tableAlias, Class<?> clazz) {
        ((SQLQuery) finder).addEntity(tableAlias, clazz);
    }
}

 

public class DynamicSelector {
    protected final Query counter;
    protected final Query finder;
    protected final Paging paging;

    /**
     * 创建可分页的查询器。
     *
     * @param finder 用于统计的Query,为null时不统计
     * @param finder 用于查询的Query
     * @param paging
     */
    public DynamicSelector(Query counter, Query finder, Paging paging) {
        this.counter = counter;
        this.finder = finder;
        this.paging = paging;
    }

    /**
     * 查询符合条件的数据
     *
     * @return
     */
    @SuppressWarnings("unchecked")
    public <T> List<T> list() {
        List<T> results = Collections.EMPTY_LIST;

        if (counter != null) {
            // 统计数据总数
            int total = ((Number) counter.uniqueResult()).intValue();
            paging.setTotal(total);

            // 总数比偏移量小,不需要执行查询
            if (total > paging.getOffset()) {
                results = listResults();
            }
        } else {
            results = listResults();
        }

        return results;

    }

    @SuppressWarnings("unchecked")
    private <T> List<T> listResults() {
        if (paging.getPageSize() > 0) {
            finder.setMaxResults(paging.getPageSize());
        }
        return finder.setFirstResult(paging.getOffset()).list();
    }
}

 

public class Paging implements Serializable {
    public static final int DEFAULT_PAGE_SIZE = 20;
    private static final long serialVersionUID = -236455755726836664L;

    private int pageNumber;
    private int pageSize;
    private List<?> content;
    private int total;
    private boolean countable = true;

    /**
     * 默认查询第一页,每页20条数据
     */
    public Paging() {
        this(1, DEFAULT_PAGE_SIZE);
    }

    /**
     * 默认每页20条数据
     *
     * @param pageNumber 当前页号
     */
    public Paging(int pageNumber) {
        this.setPageNumber(pageNumber);
        this.setPageSize(DEFAULT_PAGE_SIZE);
    }

    /**
     *
     * @param pageNumber 当前页号
     * @param pageSize 每页可查询数据量
     */
    public Paging(int pageNumber, int pageSize) {
        this.setPageNumber(pageNumber);
        this.setPageSize(pageSize);
    }

    /**
     * 每页可查询数据量
     *
     * @return
     */
    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = Math.max(0, pageSize);
    }

    /**
     * 当前页号
     *
     * @return
     */
    public int getPageNumber() {
        return pageNumber;
    }

    public void setPageNumber(int pageNumber) {
        this.pageNumber = Math.max(1, pageNumber);
    }

    /**
     * 符合查询条件的数据列表
     *
     * @return
     */
    public List<?> getContent() {
        return content == null ? Collections.EMPTY_LIST : content;
    }

    public void setContent(List<?> content) {
        this.content = content;
    }

    /**
     * 符合查询条件的数据总数
     *
     * @return
     */
    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = Math.max(0, total);
    }

    /**
     * 分页总页数
     *
     * @return
     */
    public int getTotalPage() {
        if (pageSize == 0) {
            return 1;
        }
        return (int) Math.ceil((total * 1.0) / pageSize);
    }

    /**
     * 是否查询符合查询条件的数据总数
     *
     * @return
     */
    public boolean isCountable() {
        return countable;
    }

    public void setCountable(boolean countable) {
        this.countable = countable;
    }

    /**
     * 分页查询数据的起始偏移量
     *
     * @return
     */
    public int getOffset() {
        return (pageNumber - 1) * pageSize;
    }

}

 

分享到:
评论

相关推荐

    paging:paging 原生js 简单的分页组件

    paging原生JS写的一个很轻量级很简单的分页组件页码显示逻辑比较友好嗯 是写的一个栗子 所以 木有多少复杂配置 (๑•̀ㅂ•́) ✧演示用法/** * 初始化 * onSizeOrCurrPageChangeCallBack 这个回调可以用于取后端...

    linux x86内存管理之分段与分页

    逻辑地址是程序内部使用的地址,由段选择符(Selector)和段内偏移(offset)组成。线性地址是 32 位的地址,最大寻址范围为 0x00000000 ~ 0xFFFFFFFF(4G)。物理地址是直接输出到存储芯片的地址线上的地址。 x86 ...

    x86 x64体系探索及编程part3

    283 11.4.2 在AMD64 下的CR3 285 11.4.3 PAE paging 模式里的PDPTE 结构 286 11.4.4 PAE paging 模式里的PDE 结构 286 11.4.5 PAE paging 模式里的PTE 结构 288 11.4.6 使用和测试PAE paging 模式 288 11.4.7 使用和...

    动态分页数据获取代码.rar_catch3cj_动态分页数据获取代码

    jQuery提供了丰富的选择器和DOM操作方法,如$(selector).html()、$(selector).append()等,方便地更新或插入新的HTML内容。 3. **事件绑定**:为了实现分页效果,需要为分页按钮或其他控件绑定点击事件,当用户点击...

    x86 x64体系探索及编程part4

    283 11.4.2 在AMD64 下的CR3 285 11.4.3 PAE paging 模式里的PDPTE 结构 286 11.4.4 PAE paging 模式里的PDE 结构 286 11.4.5 PAE paging 模式里的PTE 结构 288 11.4.6 使用和测试PAE paging 模式 288 11.4.7 使用和...

    x86 x64体系探索及编程 part2

    283 11.4.2 在AMD64 下的CR3 285 11.4.3 PAE paging 模式里的PDPTE 结构 286 11.4.4 PAE paging 模式里的PDE 结构 286 11.4.5 PAE paging 模式里的PTE 结构 288 11.4.6 使用和测试PAE paging 模式 288 11.4.7 使用和...

    x86 x64体系探索及编程part1

    283 11.4.2 在AMD64 下的CR3 285 11.4.3 PAE paging 模式里的PDPTE 结构 286 11.4.4 PAE paging 模式里的PDE 结构 286 11.4.5 PAE paging 模式里的PTE 结构 288 11.4.6 使用和测试PAE paging 模式 288 11.4.7 使用和...

    android自定义日历

    2. 使用`selector`资源文件为日期单元格设置不同状态下的背景色和边框。 3. 通过代码动态设置颜色和样式,例如,根据日期的属性(如节假日、生日等)改变单元格的颜色。 四、性能优化 1. 使用`DiffUtil`来比较旧...

    Linux下内存寻址.pdf

    - **段选择符**(Segment Selector):16位的字段,用于识别一个段描述符。 - **偏移量**(Offset):32位的字段,表示从段起始地址到所需内存地址的距离。 分段机制的一个关键优势是可以灵活地管理内存空间,使得...

    Android ListView详解

    可以通过设置Selector来控制ListView项的点击效果和选中状态,使界面更具交互性。 总之,熟练掌握ListView的使用对于Android开发者来说至关重要,它能够帮助你构建出功能丰富且高效的列表展示界面。通过学习和实践...

    [其他类别]Ajax分页小代码_ajaxpager(ASP.NET源码).rar

    ASP.NET提供了多种实现Ajax分页的方式,如使用UpdatePanel、AJAX Control Toolkit的Paging Control或自定义控件。AjaxPager控件通常结合AJAX技术,通过Partial Postback更新部分页面,而不是全页面刷新。这在【其他...

    ActiveMQ操作指南

    3. **消息分页(Paging)**:当队列中的消息数量过大时,ActiveMQ自动启用分页策略,防止内存溢出。 4. **网络集群(Network of Brokers)**:多个ActiveMQ实例可以组成集群,提高可用性和负载均衡。 5. **消息...

    CMPageTitleView::writing_hand_selector:一分钟集成类似抖音,新浪微博,腾讯视频,网易新闻,今日头条等常见的标题栏样式,api灵活易扩展,支持Cocoapods和石工布局,支持ChildController的完整生命周期

    效果展示 效果展示-基本样式 基本样式 GIF 00-00。颜色效果-RGB灰度 00-01。颜色效果-填充渐变 00-02。颜色效果-无渐变 00-03。切换样式-字体放大 00-04。切换样式-下划线 00-05。切换样式-遮罩 ... 00-15

    HaleyWPF:海莉WPF

    9. **集合选择器(Collection Selector)**:允许用户从一个集合中选择一个或多个项,常用于过滤或排序操作。 10. **普通Listview(Plain ListView)**:显示数据集的视图,可以以列表、小图标、详细信息等多种模式...

    nortelCDMA_parameter

    1 SYSTEM DETERMINATION AND ACQUISITION(系统决定和搜索) 8 1.1 CDMA_FREQ 8 1.2 BAND_CLASS 8 1.3 ChannelList 8 1.4 ExtChannelList 9 1.5 ServiceRedirectionList 9 1.6 OTAProtocolId 10 1.7 MIN_P_REV 10 1.8 ...

    freebsdprotmode底层文档.7z

    5.5 Segment selector values in an ordinary user mode program ........................21 6. T ASK SWITCHING ................................................................................................

Global site tag (gtag.js) - Google Analytics