pagehelper联表分页查询_pagehelper如何指定子表-程序员宅基地

技术标签: spring boot  

(springboot2.0.1、pagehelper5.1.4)

pagehelper联表分页,会默认在sql语句的后面添加 limit ?,进行分页。如果是复杂的sql联表查询结果远远不能满足我们,添加 limit在我们想要的位置进行分页,下面的代码中“AS limitable”,为分页标识的sql. 末尾带有 AS limitable 的子查询会拼接上limit进行先分页.然后再外联查询

import java.lang.reflect.Field;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;

import com.github.pagehelper.Dialect;
import com.github.pagehelper.PageException;
import com.github.pagehelper.cache.Cache;
import com.github.pagehelper.cache.CacheFactory;
import com.github.pagehelper.util.MSUtils;
import com.github.pagehelper.util.StringUtil;


@SuppressWarnings({ "rawtypes", "unchecked" })
@Intercepts({
		@Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class,
				RowBounds.class, ResultHandler.class }),
		@Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class,
				RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class }), })
public class MumuPageInterceptor implements Interceptor {
	//private static final Logger logger = LoggerFactory.getLogger(MumuPageInterceptor.class);

	// 缓存count查询的ms
	protected Cache<String, MappedStatement> msCountMap = null;
	private Dialect dialect;
	private String default_dialect_class = "com.github.pagehelper.PageHelper";
	private Field additionalParametersField;
	private String countSuffix = "_COUNT";

	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		try {
			Object[] args = invocation.getArgs();
			MappedStatement ms = (MappedStatement) args[0];
			Object parameter = args[1];
			RowBounds rowBounds = (RowBounds) args[2];
			ResultHandler resultHandler = (ResultHandler) args[3];
			Executor executor = (Executor) invocation.getTarget();
			CacheKey cacheKey;
			BoundSql boundSql;
			// 由于逻辑关系,只会进入一次
			if (args.length == 4) {
				// 4 个参数时
				boundSql = ms.getBoundSql(parameter);
				cacheKey = executor.createCacheKey(ms, parameter, rowBounds, boundSql);
			} else {
				// 6 个参数时
				cacheKey = (CacheKey) args[4];
				boundSql = (BoundSql) args[5];
			}
			List resultList;
			// 调用方法判断是否需要进行分页&#
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lianghaigui/article/details/104671316

智能推荐

Linux驱动学习--DRM框架介绍及基于DRM框架的HDMI开发_嵌入式linux hdmi视频环出功能实现-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏19次。目录一、引言二、DRM框架介绍三、DRM框架的使用四、源码分析一、引言Android4开始,hdmi等视频输出框架开始由framebuffer想DRM迁移,今天我们就来简单分析下DRM框架二、DRM框架介绍DRM是一个内核级的设备驱动,具体的说是显卡驱动的一种架构源码位置因为Linux kernel内部接口和数据结构可能随时发生变化,所以DRI模块要针对特定的内核版本进行编译。kernel 2.6.26之后的版本,DRM(DRI kernel模块)源码存放在kernel/drivers/_嵌入式linux hdmi视频环出功能实现

homebrew安装后路径只可用一次的解决办法:添加环境变量_homebrew path-程序员宅基地

文章浏览阅读2.8k次。homebrew安装后路径只可用一次的解决办法在上次安装后遇到了找不到路径的问题,虽然通过export解决了问题,但是在重启后,又出现了这个问题,现在给出:export PATH=/usr/local/bin:$PATH只能解决一次,重启后又失灵了,是因为没有写进系统环境变量中。下面将把/usr/local/bin路径写进系统环境变量中:1.执行管理权限,使用vim编辑sudo vim ~..._homebrew path

蚁群算法原理及其实现(python)_蚁群算法python代码-程序员宅基地

文章浏览阅读10w+次,点赞294次,收藏1.8k次。蚁群算法(AG)是一种模拟蚂蚁觅食行为的模拟优化算法,它是由意大利学者Dorigo M等人于1991年首先提出,并首先使用在解决TSP(旅行商问题)上。之后,又系统研究了蚁群算法的基本原理和数学模型.蚁群算法的基本思想:# -*- coding: utf-8 -*-import randomimport copyimport timeimport sysimport mathimpor..._蚁群算法python代码

ElasticSearch 8-程序员宅基地

文章浏览阅读740次,点赞24次,收藏21次。Port | LoadBalancer(外部负载均衡) | ExternalName (外部DNS解析)ports:

【数据结构】括号匹配(栈的应用)_括号匹配 栈应用-程序员宅基地

文章浏览阅读235次,点赞28次,收藏9次。括号匹配附栈基本操作_括号匹配 栈应用

css垂直居中最常用的八种布局方法_css常用垂直居中布局-程序员宅基地

文章浏览阅读531次。css垂直居中最常用的八种布局方法 首先定义两个盒子,然后进行下面操作! <body> <div class="box"> <div class="coco"></div> </div></body> 方法一 display:flex /* 1 display:flex */ .box{ width: 40..._css常用垂直居中布局

随便推点

page fault in nonpaged area 蓝屏_Windows 10系统遇到蓝屏怎么解决?-程序员宅基地

文章浏览阅读1.9k次。针对以下常见的蓝屏错误代码进行问题排除,并未提供所有错误代码的列表,但由于许多错误代码可能具有相同的解决方案,因此最佳做法是按照以下步骤操作来对蓝屏错误进行问题排除。CRITICAL_PROCESS_DIEDSYSTEM_THREAD_EXCEPTION_NOT_HANDLEDIRQL_NOT_LESS_OR_EQUALVIDEO_TDR_TIMEOUT_DETECTEDPAGE_FAU..._interrupt exception not handled/page fault in nonpaged area/system threa

虚拟机安装centos7网络配置_虚拟机centos7如何重装网络-程序员宅基地

文章浏览阅读1.8k次,点赞3次,收藏12次。1、虚拟机网络设置,设置桥接模式,复制物理网络2、修改网络配置 启用网络vi /etc/sysconfig/network-scripts/ifcfg-ens33修改ONBOOT=yes3、安装网络工具 yum search ifconfig yum install net-tools4、测试ping www.baidu.com......_虚拟机centos7如何重装网络

postgres 空间坐标转换和获取geom中心点_pgsql 获取中心点-程序员宅基地

文章浏览阅读1.4k次。select st_x(st_centroid(geom)) AS x from table_pgsql 获取中心点

基于STM32单片机智能电能表市电抄表交流电费功率无线设计23-198_stm32 智能电表-程序员宅基地

文章浏览阅读233次,点赞6次,收藏3次。23-198、基于STM32单片机智能电能表市电抄表交流电表插座电费功率检测TFT彩屏显示无线蓝牙手机APP设计功能描述:本系统由STM32F103C8T6单片机核心板、TFT1.44寸彩屏液晶显示电路、交流电压互感器TV1005M、交流电流互感器TA1005M、继电器驱动电路、无线蓝牙模块、蜂鸣器报警驱动电路及电源组成。【1】220V市电经过互感器后产生微弱交流电信号,经过整流滤波后变为直流,然后通过单片机内容AD转换进行采集,单片机换算出实际值,最终获取到交流电压(单位V)、交流电流(单位A);由功率(_stm32 智能电表

LaTex中把下标置于文本正下方的方法_latex下标在正下方-程序员宅基地

文章浏览阅读10w+次,点赞118次,收藏178次。在使用LaTex进行排版时,一个常见的需求是要把下标放在某个文字或者符号的正下方:LaTex的数学模式下提供了\limits命令,形如expr1\limits_{expr2}^{expr3}中expr2会出现在expr1的正下方,而expr3会出现在expr1的正上方,例如命令$\sum\limits_{i=0}^n {x_i}$会生成效果但是\limits命令..._latex下标在正下方

ajax json 返回,ajax返回JSON时的处理方式-程序员宅基地

文章浏览阅读3k次。JSON中对象通过“{}”来标识,一个“{}”代表一个对象,如{“AreaId”:”123”},对象的值是键值对的形式(key:value)。json_encode()该函数主要用来将数组和对象,转换为json格式json_encode(PHP 5 >= 5.2.0, PECL json >= 1.2.0)json_encode — 对变量进行 JSON 编码Report a bug ..._ajax查询数据库以json返回

推荐文章

热门文章

相关标签