Mybatis关联结果查询分页方法
Mybatis关联结果查询分页方法
Liuzh_533 发表于4年前
Mybatis关联结果查询分页方法
  • 发表于 4年前
  • 阅读 9108
  • 收藏 37
  • 点赞 3
  • 评论 10

移动开发云端新模式探索实践 >>>   

摘要: 不支持的情况 对于关联结果查询,使用分页得不到正常的结果,因为只有把数据全部查询出来,才能得到最终的结果,对这个结果进行分页才有效。因而如果是这种情况,必然要先全部查询,在对结果处理,这样就体现不出分页的作用了。 对于关联嵌套查询,使用分页的时候,只会对主SQL进行分页查询,嵌套的查询不会被分页。

#在Mybatis分页插件的说明中有如下内容 ##不支持的情况

对于关联结果查询,使用分页得不到正常的结果,因为只有把数据全部查询出来,才能得到最终的结果,对这个结果进行分页才有效。因而如果是这种情况,必然要先全部查询,在对结果处理,这样就体现不出分页的作用了。

对于关联嵌套查询,使用分页的时候,只会对主SQL进行分页查询,嵌套的查询不会被分页。

##对于不支持情况

  • 在Mybatis中没有任何简单的分页能实现该功能
  • 即使Mybatis的内存分页也不能实现关联结果查询的分页

##如果你不了解关联结果查询和关联嵌套查询
可以查看该专题进行了解。

##如何对关联结果进行分页?

  • 针对这种情况最好的方法就是手写分页,针对主要语句进行分页,对连接的表不进行分页查询
  • 针对主要语句写count查询(不需要管连接的表)
  • 这样一来,对嵌套的结果就没有影响了

##简单举例如下

<!-- lang: sql -->
select *
  from (select *
          from (select a.*, rownum rw from sys_role a where rownum <= 4)
         where rw > 0) a
  left join sys_role_function b on a.roleid = b.roleid;

这条语句分页限制为0到4,主分页语句限制为4条结果,实际结果是左连接后的结果,不止4条。
使用这种针对性的分页sql就能解决关联结果查询的问题。

##关于关联嵌套查询
嵌套查询由于都是独立的sql,主sql和分支sql都是分离的,所以使用Mybatis分页插件可以正常分页。如果你还想对关联查询的分支sql进行分页查询,基本上是不可能的,但是通过column={}这种方式传递分页参数也能实现,估计有些人看不懂这里了,就到此为止吧,不需要做这么费力不讨好的事。

##Mybatis分页插件地址:http://git.oschina.net/free/Mybatis_PageHelper

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
Liuzh_533
粉丝 692
博文 21
码字总数 40530
作品 5
评论 (10)
欲望故事
Mybatis是编程语言还是系统来的?--来自blog.clmao.com土豪版灌水机
Liuzh_533

引用来自“撒哈拉的小猫”的评论

Mybatis是编程语言还是系统来的?--来自blog.clmao.com土豪版灌水机
是一个持久化框架。。操作数据库的。。和hibernate是一类。
KaneTing
牛!之前在oschina上看到mybatis分页插件,原来是楼主这位高人写的,佩服!!
准备试用这个分页插件在自己的项目中使用。
KaneTing
这篇文章看得有点晕了,要在好好理解下!
lgl48128244

引用来自“撒哈拉的小猫”的评论

Mybatis是编程语言还是系统来的?--来自blog.clmao.com土豪版灌水机

引用来自“Liuzh_533”的评论

是一个持久化框架。。操作数据库的。。和hibernate是一类。
像此类问题就不必回复
learn_more
select *
from (select *
from (select a.*, rownum rw from sys_role a where rownum <= 4)
where rw > 0) a
left join sys_role_function b on a.roleid = b.roleid;

对于这条sql语句分页是足够了,但是如果有查询条件的话,似乎有点勉强。比如我要查询的是sys_role_function 表中某个name字段满足条件的 sys_role 记录,是不是要这样写:
select *
from (select *
from (select a.*, rownum rw from sys_role a
     left join sys_role_function b2 on a.roleid = b2.roleid
     where rownum <= 4 and b2.name like '123%')
where rw > 0) a
left join sys_role_function b on a.roleid = b.roleid;

这里只有一张关联表所以很简单,如果多个关联表,那么相当于对每张表都进行了两次关联,这样分页真的好吗?
lantian123
我需要【column={}这种方式传递分页参数】这个方法分页。烦请写个例子吧。
Atom7
【column={}这种方式传递分页参数】这个方法分页 请说明下吧 谢谢
Liuzh_533

引用来自“水元之素”的评论

【column={}这种方式传递分页参数】这个方法分页 请说明下吧 谢谢
http://blog.csdn.net/isea533/article/details/21007559
Liuzh_533

引用来自“水元之素”的评论

【column={}这种方式传递分页参数】这个方法分页 请说明下吧 谢谢
http://blog.csdn.net/isea533/article/details/21007559
×
Liuzh_533
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: