Mybatis Oracle 一对多 分页查询数据条数不一致

导读:本篇文章讲解 Mybatis Oracle 一对多 分页查询数据条数不一致,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

最近做一个评价功能开发,涉及到一对多的关系,一个评价数据对应多个评价标签,开发是用到Oracle数据库,然后一开始我是用LEFT JOIN的方式去关联这些标签然后查出标签数组List<String> pjbqs

 

实体类:(只截取部分代码)

@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
public class CpgdDTO {

    /**
     * 评价id
     */
    private String pjId;



    /**
     * 评价标签(数组)
     */
    private List<String> pjbqMcs;

     //下面其他省略
}
<resultMap id="CpgdMap" type="com.foresee.sznf.hcp.task.dto.CpgdDTO">
        <result column="pj_id" property="pjId" jdbcType="VARCHAR"/>
        <collection property="pjbqMcs" select="selectPjbqsByPjId" ofType="java.lang.String" javaType="java.util.ArrayList">
            <result column="pjbq_mc" jdbcType="VARCHAR"/>
        </collection>
    </resultMap>


<select id="selectCpjlByPage" resultMap="CpgdMap">
        SELECT
        t_a.*,
        t_c.PJBQ_MC
        FROM
        T_YW_PJ  t_a
        LEFT JOIN T_YW_RWXQ t_b ON t_b.PJ_ID = t_a.PJ_ID
        LEFT JOIN (
        SELECT
        T_YW_PJ_PJBQ.PJ_ID,
        T_YW_PJ_PJBQ.PJBQ_DM,
        T_DM_PJBQ.MC PJBQ_MC
        FROM
        T_YW_PJ_PJBQ
        LEFT JOIN T_DM_PJBQ ON T_YW_PJ_PJBQ.PJBQ_DM = T_DM_PJBQ.DM
        ) t_c ON t_c.PJ_ID = t_a.PJ_ID
</select>

然后分页的时候出现一个问题,就是Ipage查出来总数Tocal会大于实际的总数,然后每页10条的话,拉出来不到10条,是因为它的底层是按照SQL查出是还没进去去重的条数

Mybatis Oracle 一对多 分页查询数据条数不一致

像这种它这条评价 sql层面是算5条的,然后如果分页的话,拉前10条再归并 实际上那一个显示出来就没有10条。

有打算用子查询,但是Oracle会语法错误 too many values

解决办法:

    <resultMap id="CpgdMap" type="com.foresee.sznf.hcp.task.dto.CpgdDTO">
    
        <result column="pj_id" property="pjId" jdbcType="VARCHAR"/>
   
        <collection property="pjbqMcs" select="selectPjbqsByPjId" ofType="java.lang.String" javaType="java.util.ArrayList" column="PJ_ID">

            <result column="pjbq_mc" jdbcType="VARCHAR"/>
        </collection>
    </resultMap>

    <select id="selectPjbqsByPjId" resultType="string">
        SELECT PJBQ_MC FROM (
        SELECT
        T_YW_PJ_PJBQ.PJ_ID,
        T_YW_PJ_PJBQ.PJBQ_DM,
        T_DM_PJBQ.MC PJBQ_MC
        FROM
        T_YW_PJ_PJBQ
        LEFT JOIN T_DM_PJBQ ON T_YW_PJ_PJBQ.PJBQ_DM = T_DM_PJBQ.DM
        ) t_bq WHERE  t_bq.PJ_ID = #{pjId}
    </select>

<select id="selectCpjlByPage" resultMap="CpgdMap">
        SELECT
        t_a.*
        FROM
        T_YW_PJ  t_a
</select>

这种方式是先查询主表,获取到主表pj_id,再通过主表pj_id从子关联表中查询子信息列表,这种方式要和数据库交互两次,发出两次SQL语句,但是数据库返回的数据没有冗余.

好的 问题解决!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/71401.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!