2 u012819950 u012819950 于 2015.07.27 10:28 提问

求助:mybatis association 关联查询时,只返回第一条记录

1、这个是配置文件

<resultMap type="User" id="userResultMap">
    <!-- 属性名和数据库列名映射 -->
    <id property="id" column="id"  />
    <result property="userName" column="userName"  />
    <result property="userPwd" column="userPwd" />
</resultMap>

<resultMap type="Article" id="articleResultMap" >
    <id property="id" column="id" />
    <result property="title" column="title" />
    <result property="content" column="content" />
    <!-- 将article的user属性映射到userResultMap -->
    <association property="user" resultMap="userResultMap" /> 
</resultMap>

<!--查询-->
<select id="getUserArticles" parameterType="int" resultMap="articleResultMap" >
    select user.id,user.userName,user.userPwd,article.title,article.content
    from user,article where user.id = article.userId and user.id = #{id}
</select>

2、select user.id,user.userName,user.userPwd,article.title,article.content
from user,article where user.id = article.userId and user.id = 1 这条sql语句在mysql中查询是有5条记录的,但是在代码中就只有一条记录

3、public List getUserArticles(int id);
这个是接口

11个回答

strutce
strutce   Ds   Rxr 2015.07.27 11:40

图片说明

sina_2831808769
sina_2831808769   Rxr 2015.07.27 22:20

以user为主表只有1条记录

ipenglei
ipenglei   2016.01.09 02:40


select user.id,user.userName,user.userPwd,article.title,article.content
from user,article where user.id = article.userId and user.id = #{id}

这个查询里面没有查 article.id

u011320740
u011320740   2016.05.06 14:40

改成这样select article.id,article.title,article.content, user.id,user.userName,user.userAddress from user,article where user.id=article.userid and user.id=#{id}
其实就是把article表的字段写在前面,这样就article为主了

zjq78577117
zjq78577117   2015.07.27 10:34

你的id是user表里面的主键吧,怎么查也不会有五条记录吧

zjq78577117
zjq78577117 回复HaoBiaoSheng:问题解决了没?
2 年多之前 回复
zjq78577117
zjq78577117 回复HaoBiaoSheng: 我刚才写了一个,返回和执行sql数据库查询是一样的
2 年多之前 回复
zjq78577117
zjq78577117 回复HaoBiaoSheng: 我刚才写了一个,返回和执行sql数据库查询是一样的
2 年多之前 回复
zjq78577117
zjq78577117 回复HaoBiaoSheng: 我刚才写了一个,返回和执行sql数据库查询是一样的
2 年多之前 回复
u012819950
u012819950 你是指:public List getUserArticles(int id); 这个id 值?这个id 值是user表里的主键来的
2 年多之前 回复
strutce
strutce   Ds   Rxr 2015.07.27 10:36

这个是因为你返回的user表只有一条记录,在这条记录里有个articleResultMap中有个属性字段来保article表的数据看你写的是user属性(user.user)这样的情况下,他才是5条件记录

u012819950
u012819950 回复丵鹰: 还是不太懂,我得怎样改才能得到一个user 所有的article呢???
2 年多之前 回复
u012819950
u012819950 回复丵鹰: 还是不太懂,我得怎样改才能得到一个user 所有的article呢???
2 年多之前 回复
strutce
strutce 回复HaoBiaoSheng: 你可以断点一下,把返回来的结果集打开看下,也许这样你更好理解
2 年多之前 回复
strutce
strutce 回复HaoBiaoSheng: 你可以点的下,把返回来的结果集打开看下,也许这样你更好理解
2 年多之前 回复
strutce
strutce 回复HaoBiaoSheng:先申明user.的user是你返回来的结果集 返回的字段类型是user表的字段,现在你在这个user实体类里加了一个articleList字段的数据,通过association查询到的结果就放在articleList里,这样就是user.getArticleList()有5条记录,现在你是把他赋值在user上所以就是user.getUser()有5条记录
2 年多之前 回复
u012819950
u012819950 user.user??不太懂你的意思哦,可以说仔细点么?不好意思,刚接触mybatis ,你是说我的配置文件有错还是?
2 年多之前 回复
zjq78577117
zjq78577117   2015.07.27 11:11

我写的例子:我刚才试了一下,和数据库查询一样的。

在UserMapper.xml中

 <!-- resultMap
  sql语句同resultType实现的sql

  使用resultMap将查询结果中的订单信息映射到Orders对象中,
  在orders类中添加User属性,将关联查询出来的用户信息映射到orders对象中的user属性中。

  定义resultMap
  订单关联查询关联用户的resultMap
 将整个查询的结果映射到Orders类中
 -->
<resultMap type="orders" id="ordersUserResultMap">
    <!-- 配置映射的订单信息 -->
    <!-- id:指定查询列中的唯一标识,订单信息的中的唯一标识,如果有多个列组成唯一标识,配置多个id
         column:订单信息的唯一标识 列
         property:订单信息的唯一标识  列 所映射到Orders中的哪个属性 -->
     <id column="id" property="id"/>
     <result column="user_id" property="userId"/>
     <result column="createtime" property="createtime"/>
     <result column="note" property="note"/>
     <!-- 配置映射的关联的用户信息 -->
     <!-- association:用于映射关联查询单个对象的信息
          property:要将关联查询的用户信息映射到Orders中哪个属性 -->
     <association property="user" javaType="user">
        <!-- id:关联查询用户的唯一标识
             column:指定唯一标识用户信息的列 
             javaType:映射到user的哪个属性-->
         <id column="user_id" property="id" />
         <result column="username" property="username" />
         <result column="sex" property="sex"/>
         <result column="address" property="address"/>

     </association>
</resultMap>
<!-- 测试一对多查询  -->
<!-- 查询订单关联查询用户信息,使用resultMap -->
<select id="findOrdersUserResultMapById" parameterType="int" resultMap="ordersUserResultMap">
    select 
       orders.*,
       user.username,
       user.sex,
       user.address
     from
       orders,
       user
     where orders.user_id = user.id
     and user.id=#{id}
</select>

在UserMapper接口中添加

    //测试用
    public List<Orders> findOrdersUserResultMapById(int id) throws Exception;


执行单元测试

@Test
    public void findOrdersUserResultMapById() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        userMapper = sqlSession.getMapper(UserMapper.class);
        //调用userMapper的方法
        List<Orders> list = userMapper.findOrdersUserResultMapById(1);
        System.out.println(list);
    }

    控台打印
    DEBUG [main] - ==>  Preparing: select orders.*, user.username, user.sex, user.address from orders, user where orders.user_id = user.id and user.id=? 
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 2
[Orders [id=3, userId=1, number=null, createtime=Wed Feb 04 13:22:35 CST 2015, note=null, user=User [id=1, username=王五, sex=2, birthday=null, address=null, orders=[]], orderdetails=[]], Orders [id=4, userId=1, number=null, createtime=Tue Feb 03 13:22:41 CST 2015, note=null, user=User [id=1, username=王五, sex=2, birthday=null, address=null, orders=[]], orderdetails=[]]]

 去数据库执行
 select orders.*, user.username, user.sex, user.address from orders, user where orders.user_id = user.id and user.id=1
 ![图片说明](http://img.ask.csdn.net/upload/201507/27/1437966559_138292.jpg)
strutce
strutce   Ds   Rxr 2015.07.27 11:33



<!-- 将article的user属性映射到userResultMap -->
//articleList这个要加到user实体类中当一个字段,不过最好写在扩展类中

这样的结果集中就有你想要的article的数据articleList了

strutce
strutce   Ds   Rxr 2015.07.27 11:35



<!-- 将article的user属性映射到userResultMap -->
//articleList这个要加到user实体类中当一个字段,不过最好写在扩展类中



strutce
strutce   Ds   Rxr 2015.07.27 11:40
 ![图片说明](http://img.ask.csdn.net/upload/201507/27/1437968451_474580.png)
共11条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片