ibatis2.3中groupBy 一对多 解决N+1问题过程中遇到的问题..

刚学ibatis,参考网上的例子写了个一对多的小例子,用groupBy+关联查询可以只查询一次就能取出符合条件的UserList,同时每个User对象中,都还插入了UserScoreList.

刚开始是这么写的配置文件:

<resultMap class="User" id="_u" groupBy="id">
    <result property="id" column="ID" />
    <result property="name" column="NAME" />
    <result property="gender" column="GENDER" />
    <result property="age" column="AGE" />
    <result property="userScoreList" resultMap="userDetail._us" /><!--对应user中的userScoreList列表-->
</resultMap>

<resultMap class="UserScore" id="_us">
    <result property="scoreId" column="ID" />
    <result property="userId" column="USER_ID" />
    <result property="scoreName" column="SCORE_NAME" />
   <result property="totalScore" column="TOTAL_SCORE" />
    <result property="objectiveScore" column="OBJECTIVE_SCORE" />
    <result property="subjectiveScore" column="SUBJECTIVE_SCORE" />
</resultMap>

<select id="findUserByUsName" parameterClass="java.util.Map" resultMap="userDetail._u" >
        select u.ID                as id,
               u.NAME         as name,
               u.GENDER            as gender,
               u.AGE               as age,
               us.ID               as scoreId,
               us.USER_ID          as userId,
               us.NAME             as scoreName,
               us.TOTAL_SCORE      as totalScore,
               us.OBJECTIVE_SCORE  as objectiveScore,
               us.SUBJECTIVE_SCORE as subjectiveScore
          from MQ_TEST_USER u
          left join MQ_TEST_USER_SCORE us
          on   u.ID = us.USER_ID
         where us.NAME in
                  <iterate property="subjects" open="(" close=")" conjunction=",">
                #subjects[]#
                </iterate>
</select>

执行之后总是报 列名无效....纠结了很久,,,突然想到as就是起别名,然后在resultMap中的column属性应该与结果集相对应,所以如果起了别名,反而会和column属性冲突..遂改之..结果不报错了,然后发现userScoreList中的数据是不对的,name的值居然是user中name的值.因为没有起别名,结果集中u.ID和us.ID还有name列名相同了,导致userScore对象插入的是user中对应的id和name..遂又改之..终于对了....

正确配置如下:

    <resultMap class="User" id="_u" groupBy="id">
        <result property="id" column="ID" />
        <result property="name" column="NAME" />
        <result property="gender" column="GENDER" />
        <result property="age" column="AGE" />
        <result property="userScoreList" resultMap="userDetail._us" />
    </resultMap>

    <resultMap class="UserScore" id="_us">
        <result property="scoreId" column="scoreId" />
        <result property="userId" column="USER_ID" />
        <result property="scoreName" column="scoreName" />
        <result property="totalScore" column="TOTAL_SCORE" />
        <result property="objectiveScore" column="OBJECTIVE_SCORE" />
        <result property="subjectiveScore" column="SUBJECTIVE_SCORE" />
    </resultMap>
    <select id="findUserByUsName" parameterClass="java.util.Map" resultMap="userDetail._u" >
        select u.ID,
               u.NAME,
               u.GENDER,
               u.AGE,
               us.ID             as scoreId,          //将id和name于user中的分开,然后在resultMap中配置对应的column属性.
               us.USER_ID,
               us.NAME           as scoreName,
               us.TOTAL_SCORE,
               us.OBJECTIVE_SCORE,
               us.SUBJECTIVE_SCORE
          from      MQ_TEST_USER u
          left join MQ_TEST_USER_SCORE us
          on        u.ID = us.USER_ID
          where us.NAME in
                  <iterate property="subjects" open="(" close=")" conjunction=",">
                    #subjects[]#
                </iterate>
    </select>
时间: 2024-11-08 20:26:27

ibatis2.3中groupBy 一对多 解决N+1问题过程中遇到的问题..的相关文章

解决下载ftp文件过程中,浏览器直接解析文件(txt,png等)的问题

搭建了一个ftp服务器,供用户进行上传下载,在下载过程中发现,一些文件,例如txt,jpg,png,pdf等直接被浏览器解析了.在浏览器中显示其内容,没有下载. 下面通过网上查询得到一些解决方法: 1:修改ftp目录下的.htacess文件,这个文件主要做一些类型映射,使各个文件类型映射为  octet-stream 类型,这样浏览器就不能解析了. 但是,我没有在ftp目录下发现该文件,通过filezilla连接服务器, filezilla>服务器>强制显示隐藏文件 ,也没有发现该文件.听说该

解决Android Studio安装过程中“SDK tools directory is missing”的问题

“SDK tools directory is missing”,这是因为安装时你的计算机无法连接到google的服务器(对google服务器的域名地址解析出问题了),无法从google服务器下载SDK tools,安装时自动跳过安装SDK tools这一步(一闪而过). 解决方式:手动在host文件里添加要用到的google服务器IP地址.域名地址的映射.具体参见: https://www.cnblogs.com/chy18883701161/p/10863879.html     如何修改h

[debug] 解决在C++编写过程中的“找到一个或多个多重定义的符号”

如下图: 其在 common.h 中定义了一个变量a ,然后在两个 cpp 文件中都是用它. 在这种情况下,链接时就会出现 “找到一个或多个多重定义的符号”. 解决方案: 在某个cpp文件中定义,然后在 common.h 中是用 extern 在外部声明这个变量. 建立:变量的定义建立放在cpp中,在 头文件中加一个 extern 即可. 原文地址:https://www.cnblogs.com/onetrainee/p/11961511.html

解决Excel vba case过程中遇到的代码难题

(1)GetNameSpace("MAPI")返回一个namespace对象,表示指定的命名空间 唯一受支持的名称空间类型是"MAPI",GetNameSpace方法在功能上等同于Session属性. (2)GetItemFromID()返回一个Object值,表示指定的Outlook项目 (3)GetConversation()返回一个Conversation对象,表示此项目所属的对话 (4)GetRoomItems()返回一个简单项集合,包括对话的根项和所有根项

Ubuntu 14.04中root 密码忘记解决方法[转载+17.04亲测可用]

Ubuntu 14.04中root 密码忘记解决方法 Ubuntu 14.04中root 密码忘记解决方法 方法一: 如果用户具有sudo权限,那么直接可以运行如下命令: #sudo su root #passwd #更改密码 或者直接运行sudo passwd root命令就可以直接更改root密码. 有关sudo su的区别: 1.共同点:都是root用户的权限: 2.不同点:su仅仅取得root权限,工作环境不变,还是在切换之前用户的工作环境:sudo是完全取得root的权限和root的工

SCCM2016安装过程中遇到的那些问题

[推荐]SCCM2016 + SQL2016 + Server 2012 R2 安装教程 一.安装过程中遇到的问题 在安装sql的过程中,提示需要安装KB2919355,但无论是下载补丁包手动安装还是自动更新安装均无法正常安装,提示0x8007000d错误.最后通过对比MD5,发现网络问题造成下载的补丁包不正确,再次重新下载后,手动安装解决. 安装SCCM过程中,最后检验步骤提示BITS未安装,但系统中确实已经BITS且后台服务已经运行,后使用命令,在powershell中使用命令再次安装BIT

嵌入式C语言自我修养 09:链接过程中的强符号和弱符号

9.1 属性声明:weak GNU C 通过 attribute 声明weak属性,可以将一个强符号转换为弱符号. 使用方法如下. void __attribute__((weak)) func(void); int num __attribte__((weak); 编译器在编译源程序时,无论你是变量名.函数名,在它眼里,都是一个符号而已,用来表征一个地址.编译器会将这些符号集中,存放到一个叫符号表的 section 中. 在一个软件工程项目中,可能有多个源文件,由不同工程师开发.有时候可能会遇

如何处理消费过程中的重复消息?

上一节的内容最后,我们提出了一个思考.如果消息确认响应在网络传输过程中丢失了,那么消息队列的服务端.客户端会认为消息没有被正确传递,从而尝试进行下一次发送.这时候就会产生一些重复消息,那么应该怎么处理这个问题呢? 一. 重复消息一定存在吗? 在MQTT协议中,给出了三种消息传递过程中能够提供的服务质量的三种标准 At most once:至多一次.消息传递时,最多会送达一次消息.也就是说不保证消息的可靠性传输,允许丢失消息的存在.一般都是对消息可靠性要求不太高的监控场景使用,比如饮料销售柜每分钟

Springmvc框架-json数据格式传递过程中-将时间戳转化成标准的日期格式[email&#160;protected]

在上一个小demo中,我们能够看出,其实返回的日期格式也是不对的,现在返回的是一个时间戳,并不是一个标准的日期格式. 解决办法: 第一种:在要转化的实体类中添加@JSONField注解 第二种:配置fastjson的消息转换器,来处理日期格式的问题 springmvc-servlet.xml 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.spring