Mybatis Plus 基于注解的多表分页查询
前言
Mybatis Plus
提供的基础分页查询只能满足单表,不足以支持多表,如果想要多表关联查询并且分页的话只能自己手动实现sql
,今天就给大家介绍一下如何快速的基于注解方式实现多表分页查询。
实现方案
无非就是自己手动拼写sql
并交付给Mybatis Plus
管理,下面直接上代码。
public interface CustomizeQueryMapper extends BaseMapper<CustomizeEntity> {String querySql = "SELECT a.*, b.role_name FROM t_user AS a LEFT JOIN t_user_role AS b ON b.u_id = a.id ";String wrapperSql = "SELECT * from ( " + querySql + " ) AS q ${ew.customSqlSegment}";/*** 分页查询,不支持条件查询*/@Select(wrapperSql)List<CustomizeEntity> list(@Param("ew") Wrapper queryWrapper);/*** 分页查询,支持Mybatis Plus条件查询*/@Select(wrapperSql)Page<CustomizeEntity> pageList(Page page, @Param("ew") Wrapper queryWrapper);/*** 基础查询,注意是查询一条,需控制查询条件*/@Select(wrapperSql)CustomizeEntity findOne(@Param("ew") Wrapper queryWrapper);
}
注意:如表表字段不一致且字段与实体可以一一对应,使用这种方式没有问题,如果表字段不一致,例如:
SELECT a.*, b.role_name as userRoleName FROM t_user AS a LEFT JOIN t_user_role AS b ON b.u_id = a.id
则查询时需使用别名查询:
QueryWrapper qw = new QueryWrapper();qw.lambda().eq("q.userRoleName",customizeEntity.getUserRoleName);
重点要点
-
以上实现方式的关键在于
${ew.customSqlSegment}
,这样写可以使用Mybatis Plus
自身的QueryWrapper
或LambdaQueryWrapper
等查询器输出查询sql
。 -
在自定义sql种不可出现where,如想使用请在最外层包装一下,类似于我这样在最外层包装了一个临时表
q
,即可以使用自定义Where条件也可使用Mybatis Plus
自身的查询条件 -
返回实体必须与自定义mapper种的泛型实体一致,否则会报类型不匹配,例如
public interface UserRoleMapper extends BaseMapper<UserRoleEntity> {String querySql = "SELECT a.*, b.role_name FROM t_user AS a LEFT JOIN t_user_role AS b ON b.u_id = a.id ";String wrapperSql = "SELECT * from ( " + querySql + " ) AS q ${ew.customSqlSegment}";@Select(wrapperSql)CustomizeEntity findOne(@Param("ew") Wrapper queryWrapper); }
BaseMapper<UserRoleEntity>
与返回值CustomizeEntity
不匹配。 -
虽然
Mybatis Plus
提供了@TableField(exist = false)
来区分是否为数据库字段注解,但还是建议自定义查询单独创建Mapper
及响应实体。
总结
以上为本次为大家带来的Mybatis Plus
实现注解式多表分页查询,如有更好的方式或者方法欢迎大家评论指出,谢谢。
Mybatis Plus 基于注解的多表分页查询
前言
Mybatis Plus
提供的基础分页查询只能满足单表,不足以支持多表,如果想要多表关联查询并且分页的话只能自己手动实现sql
,今天就给大家介绍一下如何快速的基于注解方式实现多表分页查询。
实现方案
无非就是自己手动拼写sql
并交付给Mybatis Plus
管理,下面直接上代码。
public interface CustomizeQueryMapper extends BaseMapper<CustomizeEntity> {String querySql = "SELECT a.*, b.role_name FROM t_user AS a LEFT JOIN t_user_role AS b ON b.u_id = a.id ";String wrapperSql = "SELECT * from ( " + querySql + " ) AS q ${ew.customSqlSegment}";/*** 分页查询,不支持条件查询*/@Select(wrapperSql)List<CustomizeEntity> list(@Param("ew") Wrapper queryWrapper);/*** 分页查询,支持Mybatis Plus条件查询*/@Select(wrapperSql)Page<CustomizeEntity> pageList(Page page, @Param("ew") Wrapper queryWrapper);/*** 基础查询,注意是查询一条,需控制查询条件*/@Select(wrapperSql)CustomizeEntity findOne(@Param("ew") Wrapper queryWrapper);
}
注意:如表表字段不一致且字段与实体可以一一对应,使用这种方式没有问题,如果表字段不一致,例如:
SELECT a.*, b.role_name as userRoleName FROM t_user AS a LEFT JOIN t_user_role AS b ON b.u_id = a.id
则查询时需使用别名查询:
QueryWrapper qw = new QueryWrapper();qw.lambda().eq("q.userRoleName",customizeEntity.getUserRoleName);
重点要点
-
以上实现方式的关键在于
${ew.customSqlSegment}
,这样写可以使用Mybatis Plus
自身的QueryWrapper
或LambdaQueryWrapper
等查询器输出查询sql
。 -
在自定义sql种不可出现where,如想使用请在最外层包装一下,类似于我这样在最外层包装了一个临时表
q
,即可以使用自定义Where条件也可使用Mybatis Plus
自身的查询条件 -
返回实体必须与自定义mapper种的泛型实体一致,否则会报类型不匹配,例如
public interface UserRoleMapper extends BaseMapper<UserRoleEntity> {String querySql = "SELECT a.*, b.role_name FROM t_user AS a LEFT JOIN t_user_role AS b ON b.u_id = a.id ";String wrapperSql = "SELECT * from ( " + querySql + " ) AS q ${ew.customSqlSegment}";@Select(wrapperSql)CustomizeEntity findOne(@Param("ew") Wrapper queryWrapper); }
BaseMapper<UserRoleEntity>
与返回值CustomizeEntity
不匹配。 -
虽然
Mybatis Plus
提供了@TableField(exist = false)
来区分是否为数据库字段注解,但还是建议自定义查询单独创建Mapper
及响应实体。
总结
以上为本次为大家带来的Mybatis Plus
实现注解式多表分页查询,如有更好的方式或者方法欢迎大家评论指出,谢谢。
发布评论