Mybaits一对多映射结果集丢失数据问题

        目前Java Web开发使用最多的项目架构还是MVC,数据库持久层使用一般会选择用mybatis或者hibernate框架。对于mybatis和hibernate之间的区别大家自行百度,今天主要是记录下最近使用mybatis开发遇到的一个问题。

问题描述:A表和B表是一对多的关系,因此在查询的时候使用了mybatis 的一对多结果集映射查询,但是sql语句在库中查出来是10条(分页)数据,但是映射结果集后总是会少几条数据,而且有时候少的条数据会不一样(受查出的数据集影响)

问题还原:下面采用伪代码模拟实际业务场景遇到的问题

1@Bean 2public class A{ 3 4 private String id; 5 6 private String aname; 7 8 private List<B> blist; 9 10} 11 12 13@Bean 14public class B{ 15 16 private String id; 17 18 private String bname; 19 20 21} 22 23<?xml version="1.0" encoding="UTF-8" ?> 24<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > 25 26<mapper namespace="AMapper" > 27 28 <resultMap id="BaseResultMap" type="A" > 29 <result column="aname" property="aname" jdbcType="VARCHAR" /> 30 <collection property="blist" ofType="B"> 31 <id column="sid" property="id"/> 32 <result column="bname" property="bname"/> 33 </collection> 34 </resultMap> 35 36</mapper>

原因分析:面对这个问题在仔细检查了sql 语句后,确定不是sql语句问题,是结果集映射导致的,于是检查结果集映射代码,发现结果集映射出了问题,没有映射a表的主键导致数据集的合并,导致的数据丢失。(题外话:这个问题导致的主要原因是我开发的时候表结构是没有主键的,后来有因为业务的变化导致了表关系变化成一对多,表也加上了主键,但是结果集映射关系没有及时更改导致映射数据丢失)

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

pageHelper一对多分页解决方案

前言   pageHelper是一款优秀的Mybatis分页插件,在项目中可以非常便利的使用,使开发效率得到很大的提升,但不支持一对多结果映射的分页查询,所以在平时的使用时,对于一对多分页会出现分页错误,这篇文章主要对pageHelper分页错误进行重现以及提出解决方案。分析    mybatis进行一对多查询时,映射文件(mapper.xml

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22