mybatis-plus如何实现多表同查非多对多或者一对多

遇到一个问题 我们的业务是获取多张表的数据 ,所有的表都有一个共同的字段 但是表比较多 我不想一张一张的查 有什么办法能一次性查出来呢 我现在的做法是将这些实体类全部放在一个实体类中 但是又不知道怎么查 用的是mybatis-plus,一般馊出来的都是都是一对多或者多对多

推荐你看下这篇文章:


不过呢,一对多查询也有个不好的地方,分页难以处理。其实最好建议使用多次sql查询,然后用遍历的方式组装到一起,其实也慢不了多少

比如有A,B,C,D四张表,四张表都有相同的字段sno_id,其中a.* 代表A表中的所有字段,可以根据需要写具体的字段。
select a., b., c., d. from A a left join B b ON a.sno_id = b.sno_id left join C c ON b.sno_id = c.sno_id left join D d ON c.sno_id = d.sno_id ;

在 MyBatis-Plus 中,可以使用 @TableField 注解的 exist 属性,将一个实体类的属性与数据库表中的某个字段关联起来,从而实现多表联查的功能。这种方式常用于查询多张表中的数据,而这些表之间都存在某个共同的字段。

例如,假设有多张表,分别是 table1table2table3,它们都包含一个字段 common_field,我们需要同时查询这三个表中的数据。我们可以定义一个实体类 CommonEntity,包含三个属性 table1Fieldtable2Fieldtable3Field,然后在 CommonEntity 中使用 @TableField 注解的 exist 属性,将这三个属性与 common_field 字段关联起来,代码如下:

public class CommonEntity {
    @TableField(exist = true, value = "common_field")
    private String table1Field;
    @TableField(exist = true, value = "common_field")
    private String table2Field;
    @TableField(exist = true, value = "common_field")
    private String table3Field;
    // getter 和 setter 略
}

然后使用 MyBatis-Plus 的 BaseMapper 接口中的 selectList() 方法,传入一个 Wrapper 对象,即可实现多表联查。Wrapper 对象中可以使用 leftJoin()rightJoin()innerJoin() 等方法来指定不同的联接方式,具体使用方法可以参考 MyBatis-Plus 的官方文档。

例如,如果我们需要按照 common_field 字段进行内连接查询,可以使用以下代码:

Wrapper<CommonEntity> wrapper = new QueryWrapper<CommonEntity>()
    .eq("table1.common_field", "xxx")
    .eq("table2.common_field", "yyy")
    .eq("table3.common_field", "zzz")
    .select("table1.table1Field", "table2.table2Field", "table3.table3Field")
    .last("limit 10");
List<CommonEntity> result = commonEntityMapper.selectList(wrapper);

其中,eq() 方法用于指定查询条件,select() 方法用于指定查询结果中需要返回的列,last() 方法用于追加 SQL 语句(例如 limitorder by 等),selectList() 方法用于执行查询操作并返回结果。

除了以上方法,MyBatis-Plus 还提供了一些其他的查询方法,例如 selectMaps()(查询结果映射为 Map)、selectObjs()(查询结果映射为 Object)、selectCount()(查询结果的数量)等,可以根据具体的业务需求选择合适的方法。