MyBatis关联查询分页问题,嵌套的list中数量对不上

程序猿壹 2018-01-31 11:06:03
如题,mybatis中关联查询时,用的pageHelper,pageSize约束的不仅仅是主内容的数量,还约束了子内容的list的长度,想问问大神在用mybatis时,是怎么collection关联查询同时还能分页的,目前发现就算不用分页插件,直接在xml文件中写limit,数量依旧对不上,并且resultmap中没有相同的列名
...全文
1972 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
永夜-若离 2020-05-09
  • 打赏
  • 举报
回复
遇到同样的问题了,目前是在内存里自己实现分页逻辑。嵌套查询导致N+1的问题对性能损耗过大,查询次数过多导致IO瓶颈明显。
weixin_35802108 2018-10-30
  • 打赏
  • 举报
回复
对于一对多的嵌套结果集的方式对于分页会有问题的,比如主页五条记录,每个主记录对应两条子记录,这种情况下实际上查询的结果是十条,如果用分页插件相当于会直接在十条的基础上limit,然后再对结果集进行处理,返回的结果就会有丢失情况,非要这种你只能在内存中分页了;还有另外一种方法就是采用结果及嵌套,这种方式可以解决分页问题,只会对主查询进行分页,不过这种会有N+1问题一次查询数据多的化可能会影响点性能,这个得权衡一下了
Sunyiban 2018-01-31
  • 打赏
  • 举报
回复
引用 10 楼 qq_35374224 的回复:
[quote=引用 8 楼 u011594442 的回复:] [quote=引用 7 楼 u011594442 的回复:] [quote=引用 6 楼 qq_35374224 的回复:] [quote=引用 4 楼 u011594442 的回复:] 肯定是你的SQL写的不对呀~
sql应该是没问题的,在mysql中可以出来结果[/quote] 你加了分页再mysql中能查出 5 + 10 这种结果? 虽然mybatis是有子集这么个说法,但其实你SQL查出来的还是一条数据啊~[/quote] 以上是针对你一条SQL,你这个需求在mybatis里面应该有两条SQL:
  <resultMap id="ClazzResultMap" type="com.cn.hnust.pojo.ClazzEntity" >
    <id column="classID" property="clazzID" jdbcType="INTEGER" />
    <result column="className" property="clazzName" jdbcType="VARCHAR" />
    <collection property="studentList" column="classID" javaType="ArrayList" 
                ofType="com.cn.hnust.pojo.StudentEntity" select="getStudentByClassID"/>
  </resultMap>

  <resultMap id="StudentResultMap" type="com.cn.hnust.pojo.StudentEntity">  
    <id property="stuID" column="stuID" />  
    <result property="stuName" column="stuName" />  
    <result property="stuAge" column="stuAge" />  
    <result property="stuAddress" column="stuAddress" />
  </resultMap>  

<select id="getClassByID" resultMap="ClazzResultMap" parameterType="java.lang.Integer" >
    select classID,className
    from class_t
    where classID = #{clazzID}
</select>

<select id="getStudentByClassID" resultMap="StudentResultMap" parameterType="java.lang.Integer" >
    select stuID,stuName,stuAge,stuAddress,classID
    from student_t
    where classID = #{clazzID}
</select>
这种[/quote] 我想的一样,已经实现成功了。最后把分给你,毕竟解决方法是对的[/quote] 解决了就行了,这种方式用得少,一开始没往这方面想,反正数据不对大多都是SQL有问题,毕竟MYBATIS都是用的原SQL,不像herbinate
程序猿壹 2018-01-31
  • 打赏
  • 举报
回复
引用 8 楼 u011594442 的回复:
[quote=引用 7 楼 u011594442 的回复:] [quote=引用 6 楼 qq_35374224 的回复:] [quote=引用 4 楼 u011594442 的回复:] 肯定是你的SQL写的不对呀~
sql应该是没问题的,在mysql中可以出来结果[/quote] 你加了分页再mysql中能查出 5 + 10 这种结果? 虽然mybatis是有子集这么个说法,但其实你SQL查出来的还是一条数据啊~[/quote] 以上是针对你一条SQL,你这个需求在mybatis里面应该有两条SQL:
  <resultMap id="ClazzResultMap" type="com.cn.hnust.pojo.ClazzEntity" >
    <id column="classID" property="clazzID" jdbcType="INTEGER" />
    <result column="className" property="clazzName" jdbcType="VARCHAR" />
    <collection property="studentList" column="classID" javaType="ArrayList" 
                ofType="com.cn.hnust.pojo.StudentEntity" select="getStudentByClassID"/>
  </resultMap>

  <resultMap id="StudentResultMap" type="com.cn.hnust.pojo.StudentEntity">  
    <id property="stuID" column="stuID" />  
    <result property="stuName" column="stuName" />  
    <result property="stuAge" column="stuAge" />  
    <result property="stuAddress" column="stuAddress" />
  </resultMap>  

<select id="getClassByID" resultMap="ClazzResultMap" parameterType="java.lang.Integer" >
    select classID,className
    from class_t
    where classID = #{clazzID}
</select>

<select id="getStudentByClassID" resultMap="StudentResultMap" parameterType="java.lang.Integer" >
    select stuID,stuName,stuAge,stuAddress,classID
    from student_t
    where classID = #{clazzID}
</select>
这种[/quote] 我想的一样,已经实现成功了。最后把分给你,毕竟解决方法是对的
I_C_Fire 2018-01-31
  • 打赏
  • 举报
回复
com.baomidou.mybatisplus.plugins.pagination.Pagination; 用这个试试。可以实现 分页控制 主表的页长,结合<collection>可以实现 1对多的映射结果查询
Sunyiban 2018-01-31
  • 打赏
  • 举报
回复
引用 7 楼 u011594442 的回复:
[quote=引用 6 楼 qq_35374224 的回复:] [quote=引用 4 楼 u011594442 的回复:] 肯定是你的SQL写的不对呀~
sql应该是没问题的,在mysql中可以出来结果[/quote] 你加了分页再mysql中能查出 5 + 10 这种结果? 虽然mybatis是有子集这么个说法,但其实你SQL查出来的还是一条数据啊~[/quote] 以上是针对你一条SQL,你这个需求在mybatis里面应该有两条SQL:
  <resultMap id="ClazzResultMap" type="com.cn.hnust.pojo.ClazzEntity" >
    <id column="classID" property="clazzID" jdbcType="INTEGER" />
    <result column="className" property="clazzName" jdbcType="VARCHAR" />
    <collection property="studentList" column="classID" javaType="ArrayList" 
                ofType="com.cn.hnust.pojo.StudentEntity" select="getStudentByClassID"/>
  </resultMap>

  <resultMap id="StudentResultMap" type="com.cn.hnust.pojo.StudentEntity">  
    <id property="stuID" column="stuID" />  
    <result property="stuName" column="stuName" />  
    <result property="stuAge" column="stuAge" />  
    <result property="stuAddress" column="stuAddress" />
  </resultMap>  

<select id="getClassByID" resultMap="ClazzResultMap" parameterType="java.lang.Integer" >
    select classID,className
    from class_t
    where classID = #{clazzID}
</select>

<select id="getStudentByClassID" resultMap="StudentResultMap" parameterType="java.lang.Integer" >
    select stuID,stuName,stuAge,stuAddress,classID
    from student_t
    where classID = #{clazzID}
</select>
这种
Sunyiban 2018-01-31
  • 打赏
  • 举报
回复
引用 6 楼 qq_35374224 的回复:
[quote=引用 4 楼 u011594442 的回复:] 肯定是你的SQL写的不对呀~
sql应该是没问题的,在mysql中可以出来结果[/quote] 你加了分页再mysql中能查出 5 + 10 这种结果? 虽然mybatis是有子集这么个说法,但其实你SQL查出来的还是一条数据啊~
程序猿壹 2018-01-31
  • 打赏
  • 举报
回复
引用 4 楼 u011594442 的回复:
肯定是你的SQL写的不对呀~
sql应该是没问题的,在mysql中可以出来结果
程序猿壹 2018-01-31
  • 打赏
  • 举报
回复
引用 3 楼 maradona1984 的回复:
[quote=引用 2 楼 qq_35374224 的回复:] [quote=引用 1 楼 shayongjie 的回复:] 没有很清楚你讲的问题,能再描述具体一点吗?或者直接,上代码?
比方说 我需要查询五条记录,然后每条记录下有10条子记录,这时候我设置pageSize是5条之后,每条主记录的子记录也变成了5条,另外5条没了[/quote] 你应该检查下你代码的问题,而非怀疑mybatis,看你的分页到底是怎么分页的[/quote] 用的分页插件pageHelper,作者说是不支持嵌套映射,所以我想问问mybatis是怎么处理这个分页问题的,
Sunyiban 2018-01-31
  • 打赏
  • 举报
回复
肯定是你的SQL写的不对呀~
maradona1984 2018-01-31
  • 打赏
  • 举报
回复
引用 2 楼 qq_35374224 的回复:
[quote=引用 1 楼 shayongjie 的回复:] 没有很清楚你讲的问题,能再描述具体一点吗?或者直接,上代码?
比方说 我需要查询五条记录,然后每条记录下有10条子记录,这时候我设置pageSize是5条之后,每条主记录的子记录也变成了5条,另外5条没了[/quote] 你应该检查下你代码的问题,而非怀疑mybatis,看你的分页到底是怎么分页的
程序猿壹 2018-01-31
  • 打赏
  • 举报
回复
引用 1 楼 shayongjie 的回复:
没有很清楚你讲的问题,能再描述具体一点吗?或者直接,上代码?
比方说 我需要查询五条记录,然后每条记录下有10条子记录,这时候我设置pageSize是5条之后,每条主记录的子记录也变成了5条,另外5条没了
喜氏天狼 2018-01-31
  • 打赏
  • 举报
回复
没有很清楚你讲的问题,能再描述具体一点吗?或者直接,上代码?

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧