发生背景:前端展示的数据需要来自A表和D表拼接,A表和D表根据A表的主键进行关联,D表的非主键字段关联C表的主键,根据条件筛选出符合的数据,并且根据A表的主键关联B表的主键(多主键)的条件,过滤A表中不符合的数据。因为数据量较大,所以需要进行分页。
环境:DM DatabaseJ(达梦数据库,和Oracle差不多),JPA
使用@Query注解,使用value属性来声明查询SQL,countQuery属性取得当前查询的数量,nativeQuery属性声明为true,表示为支持当前的SQL语句为原生SQL。 ServiceImpl:
 Sort sort = new Sort(Sort.Direction.DESC, "slrq");
Pageable pageable = PageRequest.of(pageNum, pageSize, sort);
Repository:
@Query(value = "SELECT aj.ajmc AS ajmc, " +
"aj.ajlb_bm AS ajlbbm, " +
"aj.ajlb_mc AS ajlbmc, " +
"aj.cbdw_bm AS cbdwbm, " +
"aj.cbdw_mc AS cbdwmc, " +
"aj.cbjcg AS cbjcg, " +
"aj.bmsah AS bmsah, " +
"rz.ysdw_dwdm AS ysdwdm, " +
"rz.ysdw_dwmc AS ysdwmc, " +
"rz.ysay_aydm AS ysaydm, " +
"rz.ysay_aymc AS ysaymc " +
"FROM aj_yx_aj aj " +
"INNER JOIN aj_yx_slrz rz ON aj.bmsah = rz.bmsah " +
"INNER JOIN aj_xt_sldy dy ON rz.slbh = dy.slbm " +
"WHERE aj.sfsc = 'N' " +
"AND aj.cbdw_bm = :cbdwbm " +
"AND (aj.ajmc like :gjz OR aj.cbjcg like :gjz) " +
"AND aj.ajzt = '1' " +
"AND (SELECT COUNT(ry.zrrbm) FROM tyyw_gg_zrrsjls ry WHERE ry.bmsah = aj.bmsah " +
"AND ry.zrrlx_dm = '0009000900001' " +
"AND ry.sfsc = 'N') > 1 " +
"AND dy.sllb = '1' " +
"AND rz.sfsc = 'N' " +
"AND dy.sfsc = 'N' ",
countQuery = "SELECT COUNT(*) FROM " +
"(SELECT * FROM aj_yx_aj aj " +
"INNER JOIN aj_yx_slrz rz ON aj.bmsah = rz.bmsah " +
"INNER JOIN aj_xt_sldy dy ON rz.slbh = dy.slbm " +
"WHERE aj.sfsc = 'N' " +
"AND aj.cbdw_bm = :cbdwbm " +
"AND (aj.ajmc like :gjz OR aj.cbjcg like :gjz) " +
"AND aj.ajzt = '1' " +
"AND (SELECT COUNT(ry.zrrbm) FROM tyyw_gg_zrrsjls ry WHERE ry.bmsah = aj.bmsah " +
"AND ry.zrrlx_dm = '0009000900001' " +
"AND ry.sfsc = 'N') > 1 " +
"AND dy.sllb = '1' AND rz.sfsc = 'N' AND dy.sfsc = 'N' )", nativeQuery = true)
//repository层的调用方法
Page<Map> findCalb(@Param("cbdwbm") String dwbm, @Param("gjz") String gjz, Pageable pageable);
注意:
  1、方法传入参数中的Pageable参数,在SQL并没有使用这样一个参数,但是pageable中的page参数和sort参数会在查询时自动拼接到末尾,因此就达到了原生SQL实现分页排序的效果
  2、可能会出现这样一个问题:查询出来的Page.content中,所有数据可能只有值,而不是“字段名:字段值”的key-value属性,那么这样的数据就没有任何意义,也无法让前端取得任何字段的值。
  解决办法:在调用方法返回的Page类型后面加上一个Map类型即可解决。
可能大家在百度这个问题时,会发现很多回答都是在sql语句最后面加上”/#pageable/“这样一个参数,但是会发现这个并没有用,甚至还会报错:解析SQL语句出错。
(如:https://blog.csdn.net/github_34645245/article/details/81359519 中的回答) 这次问题是在工作中发现的,最重解决办法是根据本人慢慢摸索出来的,但是可能并不适用所有情况(如Mysql数据库、其他ORM框架等等均没有测试)。如果大家发现还存在其他问题,欢迎在评论区指正。
												

JPA或Hibernate中使用原生SQL实现分页查询、排序的更多相关文章

  1. 在Hibernate中使用原生SQL语句

    使用原生SQL查询必须注意:程序必须选出所有的数据列才可被转换成持久化实体.假设实体在映射时有一个<many-to-one../>的关联指向另外一个实体,则SQL查询中必须返回该<m ...

  2. JPA或Hibernate中的

    JPA执行原生SQL截断Char类型问题 在JPA的API中执行原生SQL:EntityManager.createNativeQuery(String sqlString); 传入参数是原生SQL语 ...

  3. django中使用原生sql

    在Django中使用原生Sql主要有以下几种方式: 一:extra:结果集修改器,一种提供额外查询参数的机制 二:raw:执行原始sql并返回模型实例 三:直接执行自定义Sql ( 这种方式完全不依赖 ...

  4. Django中执行原生SQL语句【新编辑】

    参考我的个人博客 这部分迁移到了个人博客中:Django中执行原生SQL语句 这里需要补充一下,还有一个extra方法: ret = models.Student.objects.all().extr ...

  5. thinkPHP框架中执行原生SQL语句的方法

    这篇文章主要介绍了thinkPHP框架中执行原生SQL语句的方法,结合实例形式分析了thinkPHP中执行原生SQL语句的相关操作技巧,并简单分析了query与execute方法的使用区别,需要的朋友 ...

  6. tp5中使用原生sql查询总结【转】

    注意事项: 1.先在database.php中配置好数据库 2.只要是数据库操作必须引用 use/think/Db;严格区分大小写. 下面是方法: public function hello5() { ...

  7. Atitit.Hibernate中Criteria 使用总结and 关联查询 and 按照子对象查询 o9o

    Atitit.Hibernate中Criteria 使用总结and 关联查询 and 按照子对象查询 o9o 1. Criteria,,Criterion ,, 1 <2. 主要的对象黑头配置磊 ...

  8. Oracle/MySql/SQL Sqlserver分页查询

    简述 简单概括一下Oracle,MySql,SQL Sqlserver这三个数据库的分页查询语句. Oracle分页查询 例:每页显示两条数据,现在要查询第二页,也就是第3-4条数据. 查询语句: s ...

  9. SQL 数据分页查询

    最近学习了一下SQL的分页查询,总结了以下几种方法. 首先建立了一个表,随意插入的一些测试数据,表结构和数据如下图: 现在假设我们要做的是每页5条数据,而现在我们要取第三页的数据.(数据太少,就每页5 ...

随机推荐

  1. vue 组件评论 的同时进行刷新

    注意:1.最重要理解这里的父组件的刷新功能,通过v-on事件绑定委托给子组件执行,因为子组件的提交按钮和父组件的刷新评论的功能是分开的. 2.没有数据时直接点击提交按钮时会出bug,并且关闭后重新加载 ...

  2. 浏览器间CSS样式兼容问题

    1.display:table居中显示 在chrome和safari浏览器上兼容问题 2.滤镜 在chrome浏览器中能正常显示,在360浏览器中不能正常显示 3.省略号问题 对于一行显示,基本上对所 ...

  3. 微信小程序弹框wx.showModal如何修改样式

    由于官方API提供的显示模态弹窗,只能简单地显示文字内容,不能对对话框内容进行自定义,欠缺灵活性,所以自己从模态弹窗的原理角度来实现了自定义的模态对话框. wx.showModal修改样式后的效果,如 ...

  4. HDU 5971"Wrestling Match"(二分图染色)

    传送门 •题意 给出 n 个人,m 场比赛: 这 m 场比赛,每一场比赛中的对决的两人,一个属于 "good player" 另一个属于 "bad player" ...

  5. windows下如何安装Composer?

    Composer 不是一个包管理器,它仅仅是一个依赖管理工具.它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目 ...

  6. vue v-for循环中key属性的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 2018-2-13-win10-UWP--蜘蛛网效果

    title author date CreateTime categories win10 UWP 蜘蛛网效果 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17 ...

  8. CodeChef Ada Pawns

    最小割 留下最多的点 形如左上或者右上没有点的点一定会留下 对于斜着的关系的两个点不能共存 黑白行染色! 白行的点称为 白点,黑点类似 反着连关系 对于一定会留下的,S到白点,黑点到T,都连inf 不 ...

  9. 前端js页面跳转

    window.location.Reload() //刷新当前页面self.location=document.referrer;通过Request Headers中Referer获得上个页面的地址并 ...

  10. dotnet 判断程序当前使用管理员运行降低权使用普通权限运行

    有一些程序是不想通过管理员权限运行的,因为在很多文件的读写,如果用了管理员权限程序写入的程序,其他普通权限的程序是无法直接访问的.本文告诉大家如何判断当前的程序是通过管理员权限运行,然后通过资源管理器 ...