BaseMapper
提供的默认查询方法都是单表的,如果须要多表关联查问,同时还要反对分页,一个计划就是本人写Sql。
当初本人写Sql个别用的应该不是传统MyBatis那种写xml的老办法,而是通过在Mapper类里写注解来实现。
还须要解决的就是如何在自定义Sql语句中拼接MyBatisPlus的分页参数和查问条件。
示例如下:
public interface GameQueryMapper extends BaseMapper<GameQuery> { 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<GameQuery> page(Page page, @Param("ew") Wrapper queryWrapper); /** * 一般查问 */ @Select(wrapperSql) List<GameQuery> 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>
中的T须要与Page<T>
统一
如果我在public interface GameMapper extends BaseMapper<Game>
里写了这样一个办法:
Page<GameQuery> 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须要独自新建,与单表实例离开。