使用分页插件的后悔药(二)


声明:本文转载自https://my.oschina.net/qixiaobo025/blog/1601017,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

背景

我们使用了pageHelper之后大部分的需求可以满足了 部分场景下不需要使用count等语句来做分页,只需要做sql查询

上一篇我们对于分页插件的问题进行了一些描述以及解决1

使用分页插件的后悔药

问题

小伙伴在使用了一段时间之后提出了新的需求。现在使用了分页插件之后已经不写orderby语句了

但是在某些场景下现在不需要使用分页 但是仍然需要使用orderby

我们在使用分页插件的后悔药中 提到使用enableCount的参数来解决

但是这样分页插件的逻辑将不会执行了 也就不会执行orderby

有没有办法也使用到orderby呢???

 

解决

抛出一个问题 当然是要解决的 我们来看一下具体执行分页的逻辑是啥

@Override public boolean skip(MappedStatement ms, Object parameterObject, RowBounds rowBounds) {     Page page = sqlUtil.getPage(parameterObject, rowBounds);     if (page == null) {         return true;     }     return (page.getPageSizeZero() != null && page.getPageSizeZero()) && page.getPageSize() == 0; }

上篇已经分析过可以设置pageSize 那我们需要分页插件的逻辑只是不希望执行count有没有办法呢?

@Override public boolean beforeCount(MappedStatement ms, Object parameterObject, RowBounds rowBounds) {     Page page = SqlUtil.getLocalPage();     return !page.isOrderByOnly() && page.isCount(); }

很明显还有一个参数名为orderByOnly

顾名思义应该是制作排序【那自然不需要count了】

我们再看一下在做查询的时候是否也不会吧页数设置进去

@Override public String getPageSql(MappedStatement ms, BoundSql boundSql, Object parameterObject, RowBounds rowBounds, CacheKey pageKey) {     String sql = boundSql.getSql();     Page page = SqlUtil.getLocalPage();     //支持 order by     String orderBy = page.getOrderBy();     if (StringUtil.isNotEmpty(orderBy)) {         pageKey.update(orderBy);         sql = OrderByParser.converToOrderBySql(sql, orderBy);     }     if (page.isOrderByOnly()) {         return sql;     }     return getPageSql(sql, page, rowBounds, pageKey); }

很明显当isOrderByOnly设置时此时分页也不会执行。

因此我们改造SoInterceptor如下

@Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})) public class SoInterceptor implements Interceptor {     private static final Joiner SORT_JOINER = Joiner.on(Constants.COMMA);       @Override     public Object intercept(Invocation invocation) throws Throwable {         Object paramter = invocation.getArgs()[1];         if (paramter instanceof So) {             So so = (So) paramter;             Page<Object> page = PageHelper.startPage(so.getCurrentPage(), so.getPageSize(), so.isEnableCount());             page.setOrderByOnly(so.isOrderByOnly());             if (so.getSorts() != null && !so.getSorts().isEmpty()) {                 page.setOrderBy(SORT_JOINER.join(so.getSorts()));             }             try {                 return invocation.proceed();             } finally {                 PageHelper.clearPage();             }         }         return invocation.proceed();     }       @Override     public Object plugin(Object target) {         if (target instanceof Executor) {             return Plugin.wrap(target, this);         } else {             return target;         }     }       @Override     public void setProperties(Properties properties) {         // Do nothing     } }

这样就可以既不分页也带排序了【条件带上orderByOnly=true】

本文发表于2018年01月03日 12:32
(c)注:本文转载自https://my.oschina.net/qixiaobo025/blog/1601017,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2477 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1