在开发中使用了mybatisplus,但是只能简单的单表查询,如果要联表查询还要支持分页,还得自己动手写了。
借鉴了老哥的写法,完美搞定
我这里也复制过来备份一下吧
public interface WorkOrderMapper extends BaseMapper<WorkOrder> {
/**
* 拼接关联的工单SQL
*/
String QUERY_SQL = "SELECT work_order.* FROM lg_work_order AS work_order " +
"INNER JOIN lg_work_order_relation AS relation ON relation.work_order_id = work_order.id " +
"WHERE relation.user_id = #{userId} AND relation.is_partner = #{isPartner} AND relation.is_acceptor = #{isAcceptor} " +
"AND relation.del_flag = 0 GROUP BY work_order.id";
/**
* 嵌入查询好的SQL 使其可以正常使用QueryWrapper查询
*/
String WRAPPER_SQL = "SELECT main.* FROM ( " + QUERY_SQL + " ) AS main ${mapper.customSqlSegment}";
/**
* 分页查询
*/
@Select(WRAPPER_SQL)
Page<WorkOrder> page(Page<WorkOrder> page,
@Param("userId")String userId,
@Param("isAcceptor") String isAcceptor,
@Param("isPartner") String isPartner,
@Param("mapper") QueryWrapper<WorkOrder> mapper);
}
关键在于Sql字符串最后那一句${mapper.customSqlSegment},是用来拼接LambdaQueryWrapper等查询条件包裹器对象最终输出的Sql语句的。
前面不能有WHERE,所以我在最外面又包了一层,将纯粹的多表关联查询语句与特殊组装语句区分开,这样不但可以在自定义Sql内部使用WHERE语句,也便于复制和创建新的Mapper。
但这里还要注意一个关键问题。
在Mapper里面自定义Sql注解对应的方法,其返回的Pojo对象,以及Mapper类指定的Pojo对象,他们必须完全一致。
否则会出现如下错误:
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需要单独新建,与单表实例分开。