mybatis中,collection配置后查询只显示一条记录

简介: 1

描述一下问题:

已知有两个表,一个是user表,一个是address,一(user)对多(address)的关系,在user的实体类里面写属性:

private List<Address> addressList = new ArrayList<Address>();
  
  public List<Address> getAddressList() {
    return addressList;
  }
  public void setAddressList(List<Address> addressList) {
    this.addressList = addressList;
  }

然后写了一个测试方法,根据用户的编号查询地址信息,一个用户对应多个地址。

配置如下:

<resultMap type="User" id="userAddMap">
  <id property="id" column="id"/>
    <result property="userName" column="userName"/>
    <result property="userCode" column="userCode"/>
    <result property="userPassword" column="userPassword"/>
    <result property="gender" column="gender"/>
    <result property="birthday" column="birthday"/>
    <result property="phone" column="phone"/>
    <result property="address" column="address"/>
    <result property="userRole" column="userRole"/>
    <result property="createdBy" column="createdBy"/>
    <result property="creationDate" column="creationDate"/>
    <result property="modifyBy" column="modifyBy"/>
    <result property="modifyDate" column="modifyDate"/>
    <result property="roleName" column="roleName"/>
    <collection property="addressList" ofType="Address">
      <id property="aid" column="id"/>
      <result property="contact" column="contact"/>
      <result property="addressDesc" column="addressDesc"/>
      <result property="postCode" column="postCode"/>
      <result property="tel" column="tel"/>
      <result property="createdBy" column="createdBy"/>
      <result property="creationDate" column="creationDate"/>
      <result property="modifyBy" column="modifyBy"/>
      <result property="modifyDate" column="modifyDate"/>
      <result property="userId" column="userId"/>
    </collection>
  </resultMap>

sql映射如下:

<select id="findUserByidAndAddress" parameterType="Integer" resultMap="userAddMap">
    
SELECT u.*,a.id,a.contact,a.addressdesc,a.postCode
    FROM smbms_user u,smbms_address a 
    WHERE u.id = a.userid AND  u.id = #{id} 
  </select>

看起来没有任何问题吧,写了个测试方法:

@Test
  public void findUserByidAndAddress(){
    SqlSession sqlSession = utils.getSqlSession();
    User user = sqlSession.getMapper(IUserDao.class).findUserByidAndAddress(1);
    List<Address> addressList = user.getAddressList();
    for (Address address : addressList) {
      System.out.println(address.getAddressDesc());
    }
  }

运行结果如图所示:

可是数据库中却有三条记录:

经过自己琢磨,不行。

然后上网查了下,原来是数据库中两个表中的主键都是id,如果配置collection一对多关联的话需要改别名,我就试着改了下,发现,可以了。

改过之后的映射文件如下:

<resultMap type="User" id="userAddMap">
  <id property="id" column="id"/>
    <result property="userName" column="userName"/>
    <result property="userCode" column="userCode"/>
    <result property="userPassword" column="userPassword"/>
    <result property="gender" column="gender"/>
    <result property="birthday" column="birthday"/>
    <result property="phone" column="phone"/>
    <result property="address" column="address"/>
    <result property="userRole" column="userRole"/>
    <result property="createdBy" column="createdBy"/>
    <result property="creationDate" column="creationDate"/>
    <result property="modifyBy" column="modifyBy"/>
    <result property="modifyDate" column="modifyDate"/>
    <result property="roleName" column="roleName"/>
    <collection property="addressList" ofType="Address">
      <id property="aid" column="aid"/>
      <result property="contact" column="contact"/>
      <result property="addressDesc" column="addressDesc"/>
      <result property="postCode" column="postCode"/>
      <result property="tel" column="tel"/>
      <result property="createdBy" column="createdBy"/>
      <result property="creationDate" column="creationDate"/>
      <result property="modifyBy" column="modifyBy"/>
      <result property="modifyDate" column="modifyDate"/>
      <result property="userId" column="userId"/>
    </collection>
  </resultMap>

sql语句如下:

<select id="findUserByidAndAddress" parameterType="Integer" resultMap="userAddMap">
    
SELECT u.*,a.id as aid,a.contact,a.addressdesc,a.postCode
    FROM smbms_user u,smbms_address a 
    WHERE u.id = a.userid AND  u.id = #{id} 
  </select>

注意:resultMap中的property对应的是实体类里面的属性,而column严格意义上来说对应的是结果集里面的列名,而不是数据库中的列,比如起别名的话就对应的是别名,不是原来的列,切记切记!!!

欢迎关注:雄雄的小课堂

相关文章
|
1月前
|
安全 Java 数据库连接
后端框架的学习----mybatis框架(3、配置解析)
这篇文章详细介绍了MyBatis框架的核心配置文件解析,包括环境配置、属性配置、类型别名设置、映射器注册以及SqlSessionFactory和SqlSession的生命周期和作用域管理。
后端框架的学习----mybatis框架(3、配置解析)
|
19天前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
25 1
|
1月前
|
缓存 Java 数据库连接
mybatis1.常见配置
本文介绍了MyBatis框架中的常见配置及其加载顺序。配置可通过`properties`元素、资源文件或方法参数传递,其中方法参数传递的属性具有最高优先级。文章列举了几个重要的配置项,如`cacheEnabled`用于全局开启或关闭缓存功能;`lazyLoadingEnabled`控制对象的延迟加载行为;`useGeneratedKeys`允许JDBC支持自动生成主键;`defaultExecutorType`设定默认执行器类型等。此外,还介绍了多环境配置方法,通过`environments`元素可定义不同环境下的数据库连接信息,并可根据需求动态选择加载特定环境
|
2月前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
56 3
|
2月前
|
Java 数据库连接 mybatis
Mybatis查询传递单个参数和传递多个参数用法
Mybatis查询传递单个参数和传递多个参数用法
46 11
MybatisPlus-标准CRUD制作,新增boolean save(T t),删除 ~ delete(int id),修改 ~ update(T t),根据id查询,T getById....
MybatisPlus-标准CRUD制作,新增boolean save(T t),删除 ~ delete(int id),修改 ~ update(T t),根据id查询,T getById....
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
MybatisPlus介绍新增用户,根据id查询,引入MybatisPlus的起步依赖,增删改查最简单的写法
MybatisPlus介绍新增用户,根据id查询,引入MybatisPlus的起步依赖,增删改查最简单的写法
接口模板,文本常用的接口Controller层,常用的controller层模板,Mybatisplus的相关配置
接口模板,文本常用的接口Controller层,常用的controller层模板,Mybatisplus的相关配置