最近做一个评价功能开发,涉及到一对多的关系,一个评价数据对应多个评价标签,开发是用到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查出是还没进去去重的条数
像这种它这条评价 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