IBATIS别名SELECT(缓存字段)引起的问题(动态sql)

简介: IBATIS别名SELECT(缓存字段)引起的问题(动态sql)

问题原因:字段不识别(多个表不同字段)

我现在有两张表,两张表中有不同的字段。

T_POLICY_BASE 字段(POLICY_NO 有)(ENDORSE_NO 无)

T_ENDORSE_BASE 字段(POLICY_NO 有)(ENDORSE_NO 有)

<select id="PolicyOrEndorse.search" parameterClass="java.util.Map" resultClass="com.tpaic.nonmotor.domain.PolicyBase">
        SELECT 
            e.POLICY_NO policyNo,
        <isEqual property="noType" compareValue="0">
            e.total_net_premium totalNetPremium
            FROM T_POLICY_BASE e
            WHERE UNDERWRITE_MARK = '2'
        </isEqual>
        <isEqual property="noType" compareValue="1">
            e.ENDORSE_NO endorseNo,
            TEI.CALCULATE_ENDORSE_PREMIUM totalNetPremium
            FROM T_ENDORSE_BASE e, T_ENDORSE_INFO TEI
            WHERE e.UNDERWRITE_MARK = '2' AND e.ENDORSE_NO = TEI.ENDORSE_NO
        </isEqual>
        <isEqual property="noType" compareValue="2">
            e.ENDORSE_NO endorseNo,
            TEI.CALCULATE_ENDORSE_PREMIUM totalNetPremium
            FROM T_ENDORSE_BASE e, T_ENDORSE_INFO TEI
            WHERE e.UNDERWRITE_MARK = '2' AND e.ENDORSE_NO = TEI.ENDORSE_NO
            <isEmpty property="policyNo" prepend="AND">
                TRUNC(e.CREATED_DATE) = TRUNC(SYSDATE - 1)
            </isEmpty>
        </isEqual>
        <isNotEmpty property="policyNo" prepend="AND">
            e.POLICY_NO = #policyNo#
        </isNotEmpty>
        <isNotEmpty property="endorseNo" prepend="AND">
            e.ENDORSE_NO = #endorseNo#
        </isNotEmpty>
    </select>

通过三个条件分支(noType 的值为 0、1、2)对应不同的表。

第一步noType=1查询,sql正常执行

第二步noType=0查询提示endorseNo字段不识别

因为T_POLICY_BASE 表中是没有ENDORSE_NO这个字段的。但是明明noType=0为什么还会走第一个1的时候的sql呢,是因为当第一次调用这个select语句时,会将字段查询出来,放入缓存中。select e.POLICY_NO policyNo,e.ENDORSE_NO endorseNo 这个时候 这两个字段都被缓存起来了。

IBATIS源码缓存

 com.ibatis.sqlmap.engine.mapping.result.AutoResultMap    
 public synchronized Object[] getResults(StatementScope statementScope, ResultSet rs) 
      throws SQLException {      
      if (allowRemapping || getResultMappings() == null) {       
      initialize(rs);     
      }      
      return super.getResults(statementScope, rs);   
}  

第二次查询时候, T_ENDORSE_BASE 表中没有ENDORSE_NO所以提示改字段不存在了。

解決方法:

第一种:(修改别名)这里要着重记录下,不然容易混淆

也就是说两张表中用一个同样的别名字段

APPLY_POLICY_NO这个字段,两张表中都有别名对应两张不同表字段即可。

<select id="PolicyOrEndorse.search" parameterClass="java.util.Map" resultClass="com.tpaic.nonmotor.domain.PolicyBase">
        SELECT 
            e.POLICY_NO policyNo,
        <isEqual property="noType" compareValue="0">
            e.APPLY_POLICY_NO applyPolicyNo
            e.total_net_premium totalNetPremium
            FROM T_POLICY_BASE e
            WHERE UNDERWRITE_MARK = '2'
        </isEqual>
        <isEqual property="noType" compareValue="1">
            e.ENDORSE_NO applyPolicyNo,
            TEI.CALCULATE_ENDORSE_PREMIUM totalNetPremium
            FROM T_ENDORSE_BASE e, T_ENDORSE_INFO TEI
            WHERE e.UNDERWRITE_MARK = '2' AND e.ENDORSE_NO = TEI.ENDORSE_NO
        </isEqual>
        <isEqual property="noType" compareValue="2">
            e.ENDORSE_NO applyPolicyNo,
            TEI.CALCULATE_ENDORSE_PREMIUM totalNetPremium
            FROM T_ENDORSE_BASE e, T_ENDORSE_INFO TEI
            WHERE e.UNDERWRITE_MARK = '2' AND e.ENDORSE_NO = TEI.ENDORSE_NO
            <isEmpty property="policyNo" prepend="AND">
                TRUNC(e.CREATED_DATE) = TRUNC(SYSDATE - 1)
            </isEmpty>
        </isEqual>
        <isNotEmpty property="policyNo" prepend="AND">
            e.POLICY_NO = #policyNo#
        </isNotEmpty>
        <isNotEmpty property="endorseNo" prepend="AND">
            e.ENDORSE_NO = #endorseNo#
        </isNotEmpty>
    </select>

第二种:最简单 添加标签属性remapResults="true"(效率,性能要考虑下)

ibatis的select标签有个属性remapResults,该属性默认值为false;为保证查询结果的正确就需要设置remapResults="true"

<select remapResults=”true”></select>,这样iBATIS会在每次查询的时候内省查询结果来设置元数据,来保证返回恰当的结果。这个属性会造成一定的性能损失,所以要谨慎使用


相关文章
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
594 0
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
Mybatis-Plus select不去查全部字段和去重
Mybatis-Plus select不去查全部字段和去重
786 0
MyBatis:关联查询,相同字段名冲突(关联查询只返回了一条子记录)
MyBatis:关联查询,相同字段名冲突(关联查询只返回了一条子记录)
352 0
MyBatis:关联查询,相同字段名冲突(关联查询只返回了一条子记录)
【Mybatis】Mybatis中特殊SQL的执行,模糊查询,批量删除,动态设置表名,添加功能获取自增的主键
【Mybatis】Mybatis中特殊SQL的执行,模糊查询,批量删除,动态设置表名,添加功能获取自增的主键
120 0
在使用MyBatis连接Oracle进行查询时遇到查询结果集不为空, 某些字段空值情况
在使用MyBatis连接Oracle进行查询时,出现运行结果正常,但是名字取值为空的情况
在使用MyBatis连接Oracle进行查询时遇到查询结果集不为空, 某些字段空值情况
Mybatis通过一条SQL查出关联的对象
 Mybatis通过一条SQL查出关联的对象 以往在做对象的查询时如果需要把关联的对象一起查出来是通过resultMap的子查询来进行的,这种用法可以参考我之前写的一篇文章http://elim.iteye.com/blog/1337009。
1054 0
Hibernate中执行NativeSQL语句查询返回自定义类型的POJO实例的List(多表查询)
Hibernate中定义了hql的概念,简单地说就是,为java的码农提供了一套类似于sql的语法,但是数据表名变成了PO名,数据字段名变成了PO中属性成员名,并把这种语法称为hql。优点就是:hql看上去是面向对象的,码农不需要知道数据库中数据表的结构,只需要依据PO编写面向对象的数据库增删改查的语句。
4206 0
Hibernate HQL基础 限定查询条件(这里面有各种条件查询)
在HQL中可以使用表达式完成指定的运算或者作为限制查询结果的条件。如下表所示 |-----------------------------------------------------------| |   类别                    |           运算符              | |---------------------------|------
1802 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等