PageHelpher、MyBatis关联查询,多表查询分页问题


一般MyBatis作为ORM框架,需要做分页一般会选择使用PageHelper。PageHelper非常强大的分页插件,和mybatis整合也非常方便。PageHelper对单表分页或者整体结果集分页是比较方便的。


不过有时我们会遇到这样的问题。利用MyBatis做多表的关联查询,分页的对象不是所有结果集,而是对其中一张表分页,然后再关联其他表的数据,如果直接使用PageHelper进行分页的话,分页结果可能会不正确。


举个例子:

SELECT d.*,c.* FROM channel_data d LEFT JOIN channel_comment c 
    ON d.id = c.dataId  ORDER BY d.pubtime DESC,c.pubtime ASC LIMIT 0,15

比如 channel_data里面有5条数据。channel_comment里面的数据与channel_data有关联,channel_data与channel_comment是一对多的关系。也就是说一个channel_data对象里面可能包含了多条channel_comment。也就是channel_data对象里面有一个List存放channel_comment。那么查询的时候自然是要对channel_data进行分页。但如果直接用PageHelpher分页,产生的SQL就如上面所示。通过left join 查询出的数据不止5条。那么PageHelper的分页机制得出的结果就不是我们想要的。


怎么解决这个问题呢?有些网友提出,如果PageHelper能解析sql注释的方法就好了。

据了解,在sql添加/**/这种注释是SQL的标准语法,在mapper中定义的sql中添加这种注释,mybatis也会把注释透传给数据库,如此一来,就可以用注释来作文章,比如:


select * from (/*start*/select * from a/*end*/) ta left join b tb on tb.ref_id = ta.id


pagehelper是有解析sql的步骤的,那么可以通过解析“start”“end”这种注释标签,来知晓添加分页、排序的位置。那么不就可以指定分页的位置了吗?想法是好的,但显然PageHelper目前不具备这个能力。


所以我们只能手动构造分页SQL而不能直接用PageHelper。额,好像到头来什么都没有说。

但一般遇到这种情况,我们会先把需要分页的数据分页。得到其结果集后再进行关联查询。这样就可以得到想要的结果。


比如上面的SQL就变为:


    SELECT d.*,c.* FROM (SELECT * FROM channel_data  LIMIT 0,15) d LEFT JOIN channel_comment c 
    ON d.id = c.dataId  ORDER BY d.pubtime DESC,c.pubtime ASC

这样查询就能得到想要的结果集了,只不过需要自己手动统计count。






  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Mybatis Plus多关联查询分页的实现可以通过使用Mybatis Plus提供的Wrapper类来实现。以下是一个示例: ```java Page<User> page = new Page<>(1, 10); QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("role_id", roleId); wrapper.orderByDesc("create_time"); IPage<User> userPage = userMapper.selectPage(page, wrapper); List<User> userList = userPage.getRecords(); ``` 在以上示例中,我们使用了QueryWrapper来构建查询条件,其中eq示等于,orderByDesc示按照create_time字段进行降序排序。然后我们调用了Mybatis Plus提供的selectPage方法来进行分页查询,其中第一个参数是Page对象,示查询的分页信息,第二个参数是Wrapper对象,示查询的条件。最后我们可以通过getRecords方法获取查询结果。 在多关联查询时,我们可以使用Mybatis Plus提供的LambdaQueryWrapper类来进行条件构造,例如: ```java LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(); wrapper.eq(User::getRoleId, roleId) .orderByDesc(User::getCreateTime); IPage<User> userPage = userMapper.selectPage(page, wrapper); ``` 以上示例使用了LambdaQueryWrapper来构造查询条件,其中eq示等于,orderByDesc示按照create_time字段进行降序排序。然后我们调用了Mybatis Plus提供的selectPage方法来进行分页查询,其中第一个参数是Page对象,示查询的分页信息,第二个参数是Wrapper对象,示查询的条件。最后我们可以通过getRecords方法获取查询结果。 需要注意的是,在多关联查询时,我们需要使用Mybatis Plus提供的@TableName和@TableField注解来指定名和字段名,以便Mybatis Plus能够正确地生成SQL语句。另外,在查询结果中,我们可以通过使用Mybatis Plus提供的@Result注解来指定实体类中的属性和查询结果中的字段的映射关系。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值