zoukankan      html  css  js  c++  java
  • mybatis之sql执行有数据但返回结果为null

      最近在使用mybatis查询数据库时,发现在pl/sql中单独执行sql时结果是有值的,但是在程序中拿到的却是null,相关配置如下:

      (1)

      <resultMap type="monitorTaskStatus" id="monitorTaskStatusMap">
           <result column="BATCH_NUM" property="batchNum"/>
           <result column="TASK_STATUS" property="taskStatus"/>
           <result column="CALLED_PHONENUM" property="calledPhoneNum"/>
       </resultMap>

      (2)

      <select id="queryStatusByProjectId" parameterType="java.lang.String" resultType="monitorTaskStatusMap">
            select b.batch_num, c.called_phonenum,c.task_status
                from cc_call_task c
                left join cc_batch_calledperson b
                on c.batch_id = b.batch_id
                where b.batch_type in (2, 3)
                and c.task_status != 5
                <if test="value != null and value != ''">
                  and c.project_id = #{value}
                </if>
         </select>

      (3)

      java:

      List<TaskStatus> callTasks = service.queryStatusByProjectId(projectId);

      debug时发现callTasks.size()=1,但是值却是null,最后搞了半天才发现原来(1)中<select>标签的resultType属性使用错误,改成resultMap即可

      究其原因是,MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部resultMap标签的引用(如本例中的(1)),但是resultType跟resultMap不能同时存在。在MyBatis进行查询映射的时候,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。当提供的返回类型属性是resultType的时候,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对象的属性,而当我们提供的返回类型是resultMap的时候,因为Map不能很好表示领域模型,我们就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。(包括如本例中的表关联查询等等情况)

      终上所述,本例中错误的原因在于已经自定义了<resultMap>中id为monitorTaskStatusMap的结果集,而需求也是要引用这个,正确的是应该用resultMap指定,我却用了resultType。。。  

      最后可以简要概括两点:

      1.当进行单表简单查询时且返回值类型是基本类型时,一般尽量使用resultType;

      2.当进行表关联查询时,或者说xml中定义了相关的resultMap标签,那么就一般尽量使用resultMap;

      3.resultType和resultMap不能同时使用。

      本文参考自:http://zhuyuehua.iteye.com/blog/1721715

  • 相关阅读:
    Ajax beforeSend和complete 方法与防止重复提交
    tablesorter周边文档
    对委托的一些短浅理解
    Nginx核心要领五:worker_processes、worker_connections设置
    二进制安装k8s 教程
    安装 Docker Engine-Community
    centos7.x 安装 NodeJS、yarn、pm2
    cfssl
    k8s各个进程 占用内存大小
    Linux下查看某一进程所占用内存的方法
  • 原文地址:https://www.cnblogs.com/jpfss/p/7681420.html
Copyright © 2011-2022 走看看