在开发中使用了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需要单独新建,与单表实例分开。

最后修改:2021 年 10 月 15 日
如果觉得我的文章对你有用,请随意赞赏