PageHelper limit自定义位置

2023-05-16

package com.sgcc.base.common.rest.model;

import com.github.pagehelper.Page;
import com.github.pagehelper.dialect.helper.MySqlDialect;
import com.github.pagehelper.util.MetaObjectUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.reflection.MetaObject;

/**
 * dyh 2022.12.02 add
 * 自定义PageHelper MySql的limit位置
 */
public class CustomPageHelperMySqlDialect extends MySqlDialect {

    public static final String LIMIT_PLACEHOLDER = "/*{LIMIT}*/"; //sql关键字


    @Override
    public Object processPageParameter(MappedStatement ms, Map<String, Object> paramMap, Page page, BoundSql boundSql, CacheKey pageKey) {
        String sql = boundSql.getSql();
        if(sql.indexOf(LIMIT_PLACEHOLDER) != -1) {
            String beforeLimitSql = sql.substring(0, sql.indexOf(LIMIT_PLACEHOLDER)); //获取分页之前的sql
            int limitPlaceholderIndex = 0;  //分页占位符的参数位置
            if(beforeLimitSql.contains("?")) limitPlaceholderIndex = (beforeLimitSql.length() - beforeLimitSql.replaceAll("[?]", "").length());

            paramMap.put(PAGEPARAMETER_FIRST, page.getStartRow());
            paramMap.put(PAGEPARAMETER_SECOND, page.getPageSize());
            //处理pageKey
            pageKey.update(page.getStartRow());
            pageKey.update(page.getPageSize());
            //处理参数配置
            if (boundSql.getParameterMappings() != null) {
                List<ParameterMapping> newParameterMappings = new ArrayList<>(boundSql.getParameterMappings());
                if (page.getStartRow() == 0) {
                    newParameterMappings.add(limitPlaceholderIndex, new ParameterMapping.Builder(ms.getConfiguration(), PAGEPARAMETER_SECOND, int.class).build());
                } else {
                    newParameterMappings.add(limitPlaceholderIndex, new ParameterMapping.Builder(ms.getConfiguration(), PAGEPARAMETER_FIRST, long.class).build());
                    newParameterMappings.add(limitPlaceholderIndex + 1,new ParameterMapping.Builder(ms.getConfiguration(), PAGEPARAMETER_SECOND, int.class).build());
                }
                MetaObject metaObject = MetaObjectUtil.forObject(boundSql);
                metaObject.setValue("parameterMappings", newParameterMappings);
            }
            return paramMap;
        }
        return super.processPageParameter(ms, paramMap, page, boundSql, pageKey);
    }

    @Override
    public String getPageSql(String sql, Page page, CacheKey pageKey) {
        if(sql.indexOf(LIMIT_PLACEHOLDER) != -1) {
            if (page.getStartRow() == 0) {
                sql = sql.replace(LIMIT_PLACEHOLDER, "\n LIMIT ? ");
                //sql = String.format(sql.replace(LIMIT_PLACEHOLDER, "\n LIMIT %s "), page.getPageSize());
            } else {
                sql = sql.replace(LIMIT_PLACEHOLDER, "\n LIMIT ?, ? ");
                //sql = String.format(sql.replace(LIMIT_PLACEHOLDER, "\n LIMIT %s, %s "), page.getStartRow(), page.getPageSize());
            }
            return sql;
        }else {
            return super.getPageSql(sql, page, pageKey);
        }
    }
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PageHelper limit自定义位置 的相关文章

  • 我有一个 has_many 关系,我想设置自定义限制和偏移量。以及计算它们

    Hy My code profile images 我只想一次只获取 10 张图像 偏移量为 10 就像这样 profile images limit gt 10 offset gt 10 不是这样的 has many images lim
  • 如何在Scala中编写极限函数?

    在想知道我的第一个 Scala 应用程序中的某些错误后 我发现我的 limit 函数根本不起作用 所以这是我的第一次尝试 def limit x Double min Double max Double if x lt min min if
  • 如何使用处理和 Twitter4j 从用户时间线获取 20 多个结果?

    我正在尝试制作一个草图 从特定用户的 Twitter 时间轴中获取最后 100 条推文 我正在使用 Twitter4j 草图工作正常 但我了解到 Twitter4J 默认情况下将时间线结果限制为 20 我已经看到此页面来了解如何在使用查询时
  • postgresql:偏移+限制变得非常慢

    我有一张桌子tmp drop ids用一列 id 以及 330 万个条目 我想迭代该表 每 200 个条目执行一些操作 我有这个代码 LIMIT 200 for offset in xrange 0 drop count LIMIT LIM
  • v3io,文件数量限制

    您知道限制或公式吗 如何计算 v3io 中的文件数量 它可能与集群中数据节点的数量和数据服务器节点上的内存大小有关 我尝试在 v3io 中使用 50 个和 8000 万个文件 它表现良好 但了解预期限制或一般建议很重要 顺便说一句 我没有这
  • 如何限制 MongoDB 中的数组大小?

    有没有办法限制可以添加到 MongoDB 数组的元素数量 我有一个Tables集合与Attendees数组应该只包含 10 个元素席位 谢谢你 您可以使用 slice http docs mongodb org manual referen
  • 使用 spring StoredProcedure 插入 oracle clob IN 参数时克服 32k 限制

    环境 oracle 11g spring jdbc 3 2 2 RELEASE jar JDK 1 7 Oracle UCP 驱动程序 我有一个存储过程 它将记录插入到具有 CLOB 列的表中 SP 在其他 IN 和 OUT 参数中具有 C
  • 如何使用 javascript 限制附加函数?

    我有一个追加按钮 如果您无休止地单击它 它就会无休止地追加 假设我希望这个按钮执行 10 次 让我用幻想代码告诉你 p我在想什么 这样我就可以从错误中吸取教训 我知道这是错的 但嘿我正在学习 thismany 1 appendbutton
  • 即使使用限制,Rails Mongoid 模型查询结果也会返回错误的大小/长度/计数信息

    当在我的 Rails 应用程序中查询某个模型时 它返回正确的结果 摘录size length or count信息 甚至使用limit标准 recipes Recipe where bitly url gt some url order b
  • SQL LIMIT 返回“零” - 0 - 行(PHP 中)

    当查询返回零行时 我在此查询中出现错误 错误号 1064 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在第 3 行 20 20 附近使用的正确语法 从玩家 pl 中选择 pl name pl email 在
  • 限制Socket io连接数

    是否可以限制nodejs中的套接字io连接数 我知道可以通过更改服务器 TCP 设置来配置限制 但我正在寻找一种在 nodejs 中执行此操作的方法 你可以很容易地实现它 var connectionsLimit 1 io on conne
  • 如何将 SQL 结果集限制为不太常见的项目

    问题 我有一份姓名和地址列表 有些姓名 人 与其他姓名 人 具有相同的地址 街道 邮政编码 城镇 我想选择所有这些名称 其地址出现次数不超过三次 并从其余名称中选择前三个名称 每个名称都指向同一地址 例子 Albert Adr1 Berta
  • 如何限制字符串中的字母数量

    我有一个程序要求用户输入问题 然后程序回答它 我想知道的是如何限制用户可以输入变量的字母数量 蟒蛇的input函数不能直接执行此操作 但您可以截断返回的字符串 或重复直到结果足够短 method 1 answer input What s
  • SQL:限制链接到每个连接行的行

    我有某些情况需要 MySQL 查询的某些结果集 让我们先看看当前的查询 然后问我的问题 SELECT thread dateline AS tdateline post dateline AS pdateline MIN post date
  • Laravel 事件超出 Pusher 允许的限制

    我的 Laravel 应用程序中有一个事件 对于特定记录 它超出了 Pusher 允许的最大限制 10240 字节 Laravel 序列化 Event 类上的每个公共属性是否正确 如果是这样 我怀疑序列化模型不应超过 10kb 限制 但无论
  • 防止PHP脚本被淹没

    我想防止我的脚本被淹没 如果用户按 F5 它每次都会执行脚本 我想防止这种情况并允许每 2 秒执行一个脚本 有什么解决方案吗 您可以使用内存缓存来执行此操作 简单的演示脚本 memcache new Memcache memcache gt
  • Twitter 搜索 API 速率限制如何运作?

    我不清楚 Twitter 速率限制 每个访问令牌 用户每小时 350 个请求 的含义 他们如何限制请求 在 1 个请求中我可以获得多少数据 速率限制基于请求 而不是您收到的数据量 例如字节 考虑到这一点 您可以通过使用您正在调用的特定端点的
  • 低于 64K 方法时出现“方法超出编译器指令限制”消息

    我经常在日志中看到类似这样的重复消息 Method exceeds compiler instruction limit 29278 in void com xxxxxxapp xxxxxx MyGLRenderer onDrawFrame
  • PHP:限制 foreach() 语句? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何限制 foreach 语句 假设我只希望它运行前 2 个 eaches 或其他什么 方法有很多 一种是使用计数器 i 0 foreac
  • Spark Collect_list 并限制结果列表

    我有以下格式的数据框 name merged key1 internalKey1 value1 key1 internalKey2 value2 key2 internalKey3 value3 我想做的是将数据框分组name 收集列表并l

随机推荐

  • mac os 查看日历_从命令行查看Mac日历

    mac os 查看日历 As someone that loves using UI tools I do pride myself in learning how to accomplish the same feats from com
  • Sql基础教程

    sql基础教程 第一章 数据库与sql1 1 数据库是什么DBMS的种类 1 2 数据库的结构表的结构 1 3 SQL 概要SQL语句及其种类SQL的基本书写规则 1 4 表的创建数据库的创建表的创建命名规则数据类型约束的设置 1 5 表的
  • Jetson TX2更换软件源(转)

    感谢博客 xff1a 点击打开链接 TX2的软件源为国外服务器 xff0c 网速会很慢 xff0c 需要换国内的ARM源 1 备份 etc lib路径下的source list文件 xff0c 然后在终端 xff08 按ctrl 43 al
  • c语言中求数组长度(*的作用,定义指针变量与取值)

    最近在学习c语言 xff0c 在c语言中少了很多库函数 xff0c 就比如我在求数组长度的时候 xff0c len 不能用了 xff0c 这在python中是自带的函数 即使在c 43 43 中 xff0c 求字符串长度时也能用str le
  • 个人使用ubuntu18相关配置

    root登陆 1 首先获得临时的root权限 xff0c 因为后面的一些操作需要root权限才可以 xff0c 打开终端输入以下命令 sudo s 之后直接输入当前账户的密码 xff0c 就可以获得临时的root权限 2 先创建root账户
  • Manjaro内存不足解决记录

    1 Linux虚拟机 最近在家闲得没事做 xff0c 就使用VMware装了一个linux虚拟机 xff0c 虽然之前装过许多linux发行版的虚拟机 xff0c 也装过win10 43 Deepin双系统 xff0c 但是从来没具体了解过
  • String/StringBuilder/StringBuffer

    String StringBuilder StringBuffer 1 可变性 String 字符串常量 xff0c 字符串是不可变的 源码中 xff1a span class token keyword private span span
  • 计算机网络-网络结构

    计算机网络 三种网络结构 OSI xff1a 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 TCP IP xff1a 网络接口层 网际层 传输层 应用层 五层 xff1a 物理层 数据链路层 网络层 传输层 应用层 应用层 它
  • 计算机网络-三次握手/四次挥手/可靠传输/ARQ协议

    计算机网络 TCP三次握手 同步SYN 确认ACK 发送端 SYN标志的数据报 seq 61 x gt 接收端 xff08 SYN 61 1 xff09 发送端 lt SYN ACK标志的数据报 seq 61 y ack 61 x 43 1
  • 计算机网络-拥塞控制/HTTP/URL

    滑动窗口和流量控制 TCP利用滑动窗口实现流量控制 xff0c 流量控制就是为了控制发送方发送速率 xff0c 保证接收方来得及接收 接收方发送的确认报文中的窗口字段可以来控制发送方窗口大小 xff0c 从而影响发送方的发送速率 xff0c
  • Integer和int进行==比较

    Integer amp int int是Java的基本数据类型 xff0c 而Integer是它的包装类 xff0c 61 61 在进行比较时 xff0c 如果是基本类型 xff0c 比较的是值 xff0c 如果是引用类型 xff0c 比较
  • deepin恢复出厂设置_如何恢复出厂设置

    deepin恢复出厂设置 There comes a time in every user s life when they have to reset something back to its factory default Perha
  • JUC-JMM/Volatile/单例模式

    JMM Java内存模型 xff0c 是一个概念 xff0c 不存在的东西 xff0c 概念 约定 关于JMM的一些同步约定 xff1a 线程解锁前 xff0c 必须把共享变量刷回主存线程加锁前 xff0c 必须读取主存中的最新值到工作内存
  • 设计模式-六大原则/单例模式

    设计模式 概念 xff1a 是一套被反复使用 多数人知晓的 经过分类编目的 代码设计经验的总结 作用 xff1a 为了可重用代码 让代码更容易被他人理解 保证代码可靠性 程序的重用性 JDK Spring等源码中许多地方用到了设计模式 设计
  • 设计模式-工厂模式/代理模式

    工厂模式 创建对象时不会对客户端暴露创建逻辑 xff0c 并且通过使用一个共同的接口来指向新创建的对象 xff0c 实现创建者和调用者分离 xff0c 工厂模式分为简单工厂 工厂方法 抽象工厂 xff0c Spring中的IOC容器创建be
  • WSL2+VcXsrv 打开图形窗口实现可视化

    前些天有个朋友拜托我帮忙看看 老师让配置的 Cygwin 安装 gnuplot 用 XLaunch 做图形界面 始终画不出图来 这个问题我研一的时候也遇到过 走了许多弯路 所以在电脑上一阵鼓捣 现在做一个如下记录 Cygwin 43 XLa
  • gitlab 安装/卸载/备份/迁移/汉化/重置root密码 全套教程

    服务器环境 centos7 4 gitlab版本 gitlab span class token operator span ce span class token operator span 11 span class token pun
  • bash: line 5: bgzip: command not found

    报错信息 xff1a bash line 5 bgzip command not found 解决方式 xff1a conda install tabix
  • linux之chgrp命令

    chgrp 命令更改 目录或文件所属的组 chgrp R 目录 或 文件 R xff1a 递归式改变指定目录及目录下所有文件和子目录 chgrp eg chgrp group2 file2 将file2的属组更改为group2 以空格分开
  • PageHelper limit自定义位置

    package com sgcc base common rest model import com github pagehelper Page import com github pagehelper dialect helper My