这几天做了个关于mybatis一对多的分页,发现了一个bug,在这记录下。
代码分析
一对多包装类如下
@Data
public class AreaStoreEnv {
private java.lang.String id;
private java.util.Date createTime;
private java.util.Date updateTime;
private java.lang.Integer orders;
private java.lang.String fullName;
private java.lang.Integer grade;
private java.lang.String name;
private java.lang.String treePath;
private java.lang.String parentId;
/**
* 知识库信息
*/
private List<StoreEnv> storeEnvList;
}
这时候如果使用正常的一对多写一个resultMap然后通过left join分页查询,然后每页数量为10,他会将嵌套的内容也当做查询结果数量,这样分页查的数量就不足10个。
解决方案
在collection标签里加select属性来单独调用查询多方数据。column属性为传入的参数
<resultMap id="AreaStoreEnvMap" type="org.scloud.modules.storeEnv.vo.AreaStoreEnv">
<id column="id" property="id"/>
<result column="full_name" property="fullName"/>
<result column="grade" property="grade"/>
<result column="parent_id" property="parentId"/>
<result column="name" property="name"/>
<collection property="storeEnvList"
select="getStoreEnv"
column="id"
ofType="org.scloud.modules.storeEnv.entity.StoreEnv">
<id column="sid" property="id"/>
<result column="area_id" property="areaId"/>
<result column="env_data_type" property="envDataType"/>
<result column="file_name" property="fileName"/>
<result column="file_url" property="fileUrl"/>
<result column="remark" property="remark"/>
</collection>
</resultMap>
```
查询语句
```xml
<select id="searchAreaStoreEnvByAreaIds" resultMap="AreaStoreEnvMap">
select a.*
from sc_area a
<where>
<foreach collection="areaIds" item="id" open="and a.id in (" close=") " separator=",">
#{id}
</foreach>
</where>
order by a.grade
</select>
<!-- mybatis嵌套查询分页后数量会有bug,解决方案如下-->
<select id="getStoreEnv" parameterType="String" resultType="org.scloud.modules.storeEnv.entity.StoreEnv">
select se.id as sid,se.area_id,se.env_data_type,se.file_name,se.file_url,se.remark
from sc_basic_store_env se
where se.area_id=#{id}
order by se.env_data_type,se.create_time desc
</select>
```