java 多表分页_MyBatisPlus分页多表关联查询

本文介绍了在Java中使用MyBatisPlus进行多表分页查询的方法。通过在Mapper接口中自定义SQL注解,并利用${ew.customSqlSegment}拼接分页参数和查询条件。关键点在于保持自定义SQL的Pojo对象与BaseMapper中指定的Pojo对象一致,避免MybatisPlus找不到lambda缓存的问题。为了确保分页功能正常,多表关联查询的Mapper应单独创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring+spring mvc mybatis整合

113.5元

包邮

(需用券)

去购买 >

7c3c2fdaa721f1f38e1e8503f447af8f.png

BaseMapper提供的默认查询方法都是单表的,如果需要多表关联查询,同时还要支持分页,一个方案就是自己写Sql。

现在自己写Sql一般用的应该不是传统MyBatis那种写xml的老方法,而是通过在Mapper类里写注解来实现。

还需要解决的就是如何在自定义Sql语句中拼接MyBatisPlus的分页参数和查询条件。

示例如下:public interface GameQueryMapper extends BaseMapper {

String querySql = "SELECT a.*, b.org_id FROM t_game AS a LEFT JOIN t_game_game_org AS b ON b.game_id = a.id ";

String wrapperSql = "SELECT * from ( " + querySql + " ) AS q ${ew.customSqlSegment}";

/**

* 分页查询

*/

@Select(wrapperSql)

Page page(Page page, @Param("ew") Wrapper queryWrapper);

/**

* 普通查询

*/

@Select(wrapperSql)

List list(@Param("ew") Wrapper queryWrapper);

/**

* 单独查询

*/

@Select(wrapperSql)

QyyOrgQuery one(@Param("ew") Wrapper queryWrapper);

}

关键在于Sql字符串最后那一句${ew.customSqlSegment},是用来拼接LambdaQueryWrapper等查询条件包裹器对象最终输出的Sql语句的。

前面不能有WHERE,所以我在最外面又包了一层,将纯粹的多表关联查询语句与特殊组装语句区分开,这样不但可以在自定义Sql内部使用WHERE语句,也便于复制和创建新的Mapper。

但这里还要注意一个关键问题。

在Mapper里面自定义Sql注解对应的方法,其返回的Pojo对象,以及Mapper类指定的Pojo对象,他们必须完全一致。

即:extends BaseMapper 中的T需要与Page一致

如果我在public interface GameMapper extends BaseMapper里写了这样一个方法:Page page(Page page, @Param("ew") Wrapper queryWrapper);

即使GameQuery这个对应多表关联字段的Pojo继承自Game,也会出现如下错误:evaluating expression 'ew.customSqlSegment'. Cause: org.apache.ibatis.ognl.OgnlException: customSqlSegment [com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: can not find lambda cache for this entity

因此,多表关联分页查询的Mapper需要单独新建,与单表实例分开。

java 11官方入门(第8版)教材

79.84元

包邮

(需用券)

去购买 >

f0f3f55624fb396b1764d42d6df88864.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值