经常会遇到列表页要关联几个表查询,主表只保存关联表的ID,要显示关联表的ID,则需要查询列表时一起查出来。使用MyBatis-Plus可以使用多种方式联合查询,例如使用mapper 的 xml ,也可以使用 QueryWrapper 提供的方法查询。下面介绍最简单,最便捷的方法,上代码:
QueryWrapper<SpuInfoEntity> wrapper = new QueryWrapper<>();
wrapper.select("id","spu_name","weight","publish_status","create_time","update_time",
"(SELECT b.name FROM pms_brand b WHERE b.brand_id = pms_spu_info.brand_Id) AS brandName" ,
"(SELECT c.name FROM pms_category c WHERE c.cat_id = pms_spu_info.catalog_Id) AS categoryName");
IPage<SpuInfoEntity> page = this.page(
new Query<SpuInfoEntity>().getPage(params),
wrapper
);
return new PageUtils(page);
使用 QueryWrapper 的 select()方法定义需要搜索的字段,将ID字段转化为名称字段,这样就可以写一次查询,其他交给MySQL执行。
这种方法比 Left JOIN 方法要多了几毫秒,分页每次读10-20条也不影响。
分类和品牌都读出来了。
以上方式有缺点,要查询子表的字段时,无法使用语句where。
所以我认为最好的方式就是建立数据库视图表,通过查询视图表返回一个VO