最新更新解决分页查询的一对多,总条数对不上的原因
第一种方法,联合查询
在实体类先声明一个对多的集合对象
然后在mapper创建一对多的映射关系,<collection 是一对多;<association 是一对一,注意一对多必须放在最下面,如果多个一对多,都放在最下面即可
正常写语句,返回的时候是resultMap,注意必须有一对多中“一”的数据,也就是下面的s.*,不然没法映射
最后出来的效果就是
第二种方法:子查询的方式
2022.10
最近项目又用到mybatis,再次使用一对多的查询时,发现会影响分页的bug,修改一对多映射
老样子,先在实体类创建两个 关联的实体集合
mapper.xml的一对多有改变,具体对比上面
oftype 是要返回 ”多“的数据类型,select是查询的id,需要注意的是column,这里指的是要关联的表的值,对应的是我下方#{id}的值,这也是用来对应关系的,
最后就是正常写一个select查询主表的语句,这个时候不用关联其他表
这样的一对多查询,分页查询的total就是正常的了
2022.11
最近用这个新的一对多方式,又遇到一个奇葩问题,那就是子查询的传值问题,话不多说上图和解决办法
这是我主查询,单表的查询,但是我要把startDate 和 endDate 传入 一对多的多,也就是子查询里面当条件
<collection 设置 column的条件 {id=id这是主查询和子查询连接的id,startDate主查询用不到,给子查询当条件用}
case when ('${startDate}' !='')then '${startDate}' else '' end as startDate,
case when ('${endDate}' !='')then '${endDate}' else '' end as endDate
总结一下
第一种方法:
sql直接关联查询,然后结果集通过resultMap的collection映射
优点:条件过滤很方便
缺点:很明显,先关联查询,后映射,分页查询就是致命的
第二种方式:
通过resultMap中collection标签的select属性去执行子查询,所需参数通过column传递
优点:分页和普通查询都能满足,超级方便,主表的条件也很ok
缺点:就是查询条件要放到”多“的这张表上的时候,子表条件查询有点复杂
okkkk,搞清楚了就继续加油吧