ibatis和是否支持union无关,ibatis只负责执行sql
然后把结果集放入对象中

解决方案 »

  1.   

    哈哈.搞定了.贴出来凉凉!!
    <select id="AAAA"
        parameterClass="java.util.Map" resultMap="indexMap">
    <dynamic prepend="">
      <iterate property="libcode" conjunction="UNION">
    <![CDATA[SELECT * FROM INDEX_$libcode[]$ WHERE]]>
    <iterate property="searchKey" conjunction="OR">
    <![CDATA[CONTEXT LIKE '%$searchKey[]$%']]>
    </iterate>
    </iterate>
     </dynamic>
             <![CDATA[ORDER BY rc_id]]>
    </select>上面的libcode和searchKey都是Map的的key 里面的value是 2个数组当然也可以是list
    这里动态的表名和union连接
    有讨论的联系我.
      

  2.   

    上面的libcode[] 和 searchKey[]
    的[] 可别忘了.不然ibaits会把当成String的(这句话是书上抄的.)
      

  3.   

    既然如此慷慨,就提些建议:
    1.如果sql中没有大于或小于符合,可以不写CDATA,看上去累赘
    2.libcode应该是不同的值吧,oracle的话,union改成union all效率更高,union会检查重复
    3.dynamic不该放在那儿,
    SELECT * FROM INDEX_$libcode[]$ 
    <dynamic prepend="WHERE">
    ...
    </dynamic>
    或者<iterate ... open="WHERE">试试,尽量使得没有条件时也能执行4.可以的话searchKey[]尽量用##,比如'%'||#searchKey[]#||'%'
      

  4.   

    哈哈谢谢你的建议. 我把select放在dynamic里面是为了动态连接相同结构的不同的表.
    因为是老系统的数据库.设计的有问题.相同结果的表有很多 比如 talbe_1,table_2.......很多
    要用户选择不同的表来检索才写成那样的. 写在外面就没法动态union了.2 要把union改成 union all3 # 和 $ 有啥区别呀.上面的配置换成#就报错.我也不懂.感谢呀!
      

  5.   

    #会判断类型,比如字符串,会自己判断并加引号
    如果字符串里有特殊字符也会转换$是字符串直接连接,from $tablename$ where col=#col#dynamic不是这样用的,比如where后面跟着一些条件,如果条件没有,dynamic能判断是否需要where你应该看看ibatis中文文档
      

  6.   

    o .我需要的是下面这样的语句.所以这样写.并且实现了.哈哈
     SELECTID,NAME,AGE,SEX,MESSAGE FROM TABLE_0 WHERE  MESSAGE LIKE '%1%' AND  MESSAGE LIKE '%2%' AND MESSAGE 
    LIKE '%ibatis%' UNION ALL    
    SELECT ID,NAME,AGE,SEX,MESSAGE FROM TABLE_3 WHERE  MESSAGE LIKE '%1%' AND  MESSAGE LIKE '%2%'  AND  MESSAGE LIKE '%ibatis%' UNION ALL    
     SELECT ID,NAME,AGE,SEX,MESSAGE  FROM TABLE_8 WHERE MESSAGE LIKE '%1%' AND MESSAGE LIKE '%2%'  AND MESSAGE 
    LIKE '%ibatis%'   ORDER BY ID