SpringDataJpa如何使用union多表分页条件查询
作者:Hyz.. 发布时间:2023-05-16 04:28:49
如何使用union多表分页条件查询
当前项目有一个全局搜索的功能,需要涉及到7-8张主表,由于当前项目使用的是Jpa,所以我决定使用原生sql的方式使用union来进行查询,由于对这个框架的不熟悉,被坑了很久,特此记录。
条件
1、在参数列表中,使用@Param注解(例:@Param(“userId”) Long userId)
2、在sql中应该以 :userId 的方式来注入参数(例:person.user_id = :userId),或者用?1 ?2根据参数的顺序来注入也可以,我采用的是第一种
3、sql应该是写在@Query的value中,并且设置 nativeQuery = true
4、如果要设置一个可能为空的值,比如:有一个分类,需要当作条件查询,但是这个值是可能为空的,所以需要在sql中判断,如果为空就不进行筛选。语法其实和在sql中判断是一样的
where IF(:category is not null,a.category = :category is not null,1=1)
分页
1、分页必须加countQuery这个参数,把上面sql价格count就可以
2、传入Pageable,不要传sort,不然会报错,暂时没找到解决方案
例如 select * from a 为你的sql
那么分页应该是
select * from (select * from a) b order by ?#{#pageable}
order by在countQuery里面就不用加了哦
3、返回的是Page<Object[]>,里面content封装的顺序就是你sql查出来的顺序
踩过的坑
1、多表union查询,查询的字段应该是一样的,比如第一张user表查询id,name,sex、第二张address表也必须查询id,name,sex,如果没有这个字段则自己封装返回固定的值,可以为空字符串
2、传入pageable的时候 ?#{#pageable} 必须这样写
分享几个用到的mysql语法
1、判断是否为空,不为空查询时间在传入时间之间的数据
IF(:startTime is not null and :endTime is not null,proc.create_time between :startTime and :endTime,1=1)
这边我在service是判断了结束时间是否为空的,如果结束时间为空,开始时间不为空默认查询一年的数据
2、根据名称模糊查询
proc.content LIKE CONCAT('%',:content,'%')
3、最后根据查出来的总数据对类型筛选
IF(:category is not null,a.category = :category is not null,1=1)
小结一下:
1、其实很简单的分页条件查询,因为不熟悉jpa的语法,导致浪费了很多时间,希望可以帮到更多的人。
2、暂时不知道怎么排序,无论是在pageable中传入sort,还是在sql最后进行排序都会报错,如果有大佬知道的话可以点拨一下。
jpa执行原生sql union bug解决
@Query(value = "SELECT * FROM count_entity where id=-1111 union (SELECT * FROM count_entity where video_name = ?1 AND platform ='腾讯视频' ORDER BY click_date DESC LIMIT ?2)"
+ "UNION"
+ "(SELECT * FROM count_entity where video_name = ?1 AND platform ='爱奇艺' ORDER BY click_date DESC LIMIT ?2)"
+ "UNION"
+ "(SELECT * FROM count_entity where video_name = ?1 AND platform ='芒果TV' ORDER BY click_date DESC LIMIT ?2)", nativeQuery = true)
union前面需要连接一个空数据查询,因为union 第一个查询不能用()
来源:https://blog.csdn.net/weixin_43842164/article/details/101347322
猜你喜欢
- 1、AOP基本总结连接点(JoinPoint):连接点是程序运行的某个阶段点,如方法调用、异常抛出等切入点(Pointcut):切入点是Jo
- 声明:下面的实例全部在linux下尝试,window下未尝试。有兴趣者可以试一下。文章针c初学者。c语言的强符号和弱符号是c初学者经常容易犯
- 一、结构型模式结构型模式有什么好处?从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题二、适配器模式USB网线转换器三、
- 介绍Java命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而使不同的请求可以进行参数化,并支持请
- makeCertPic.javapackage pic;import java.awt.Color;import java.awt.Font
- 本文实例讲述了Java定义泛型方法。分享给大家供大家参考,具体如下:一 点睛1 如果定义类、接口是没有使用类型形参,但定义方法时想自己定义类
- Profile多环境配置我们在开发项目时,通常同一套程序会被发布到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、red
- ArrayList和LinkedList都实现了List接口,有以下的不同点:1、ArrayList是基于索引的数据接口,它的底层是数组。它
- 一、堆栈内存堆栈内存,顾名思义,指的是堆内存以及栈内存,其中,堆内存是由Java GC进行管理的内存区域,而栈内存则是线程内存。关于栈内存,
- Android 资源 id详解我们平时获取资源是通过 findViewById 方法进行的,比如我们常在onCreate方法中使用这样的语句
- //哈弗曼编码的实现类public class HffmanCoding { private int c
- 错误展示:Information:java: Errors occurred while compiling module 'emp
- 前言 因为自己在做的一个小软件里面需要用到从A-Z排序的ListView,所以自然而然的想到了微信的联系人,我想要的就是那样的效果。本来没
- 前言在使用Java开发接口请求中,我们需要对请求进行进行统一返回值,这时候我们自己封装一个统一的Result返回类,下面就介绍下我用的这种的
- 前言:小编引入的图片和文字描述都是来自于尚硅谷的视频讲解,在此感谢尚硅谷的老师,同时也结合 seata文档官方文档进行整合项目地址(gite
- 1.准备工作1、JDK安装2、Maven安装3、Git安装4、jenkins安装以上软件安装成功后进入jenkins进行相关配置。如果需要通
- 今天我们来讨论如何在项目开发中优雅地使用RocketMQ。本文分为三部分,第一部分实现SpringBoot与RocketMQ的整合,第二部分
- java 反射机制:测试实体类以Human为例/** * Project: Day12_for_lxy * Created: Lulu *
- mysql实现配置中心本公司配置数据的管理是通过mysql进行配置管理,因为已经搭建好了,所以自己动手重新搭建一遍,熟悉整个流程。有关项目源
- 前言:文件的上传和下载在日常开发中很是常见,那么这一功能是如何实现的呢,下面我给大家介绍一下实现条件:1、需要一个form标签,method