论坛首页 Java企业应用论坛

iBatis中怎样按条件选择不同的表来执行查询

浏览 12895 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-12-18  
手头有个项目,里在涉及到多表的查询(Oracle10g),举个例子:
表A,表B,表C,其中表A,B的结构是一样的(字段名称、类型均一样),但表示不同类型的数据,表C与A,B的结构不一样,但都有一同名主键列.

现在的需求是:
if(条件A)
  从表A,C里查询需要的数据
else if(条件B)
   从表B,C里查询需要的数据

其中条件A和B是页面上用户的输入(选择),
我本来想的是用union all来这样做:


if(条件A) 从表A,C里查询需要的数据

union all

if(条件B) 从表B,C里查询需要的数据
但由于要分页,当我再这样操作时:

select T.*,rownum selectedRow from
(

if(条件A) 从表A,C里查询需要的数据

union all

if(条件B) 从表B,C里查询需要的数据
) T
报列名不确定的错误(column ambiguously defined),因为表A和B的结构一样。

请问下高手们,iBatis中怎样按条件选择不同的表来执行查询呢?
   发表时间:2011-12-19  
个人觉得按照条件来替换表名不方便,当前使用可能很好,如果今后有需求变更就麻烦了。
还不如根据条件调用不同的service这样的接口进行选择
0 请登录后投票
   发表时间:2011-12-19  
建议在代码里做判断、数据组合,SQL处理虽然简单,但后患无穷,扩展、效率都是麻烦
0 请登录后投票
   发表时间:2011-12-20  
可以参考一下bboss持久层动态sql语句使用方法,很好地实现你的要求
0 请登录后投票
   发表时间:2011-12-20  
建议根据用户不同的选择,调用不同的server执行不同的逻辑。
0 请登录后投票
   发表时间:2011-12-20  
在配置文件里面就可以修改

<select id="getXXXX" resultClass="xxxxxVO" parameterClass="xxxVO">
  select * from
  <isEqual property="xxxVO.falg" compareValue="A">
    tableA
  </isEqual>
   <isEqual property="xxxVO.falg" compareValue="B">
    tableB
  </isEqual>
  <isEqual property="xxxVO.falg" compareValue="C">
    tableC
  </isEqual>
</select>


或者

<select id="getXXXX" resultClass="xxxxxVO" parameterClass="xxxVO">
   <isEqual property="xxxVO.falg" compareValue="A">
   select * from  tableA
  </isEqual>
   <isEqual property="xxxVO.falg" compareValue="B">
    select * from  tableB
  </isEqual>
  <isEqual property="xxxVO.falg" compareValue="C">
    select * from  tableC
  </isEqual>
</select>

返回字段可以用别名统一就可以了
0 请登录后投票
   发表时间:2011-12-20  
四书五经 写道
[color=green]现在的需求是:
if(条件A)
  从表A,C里查询需要的数据
else if(条件B)
   从表B,C里查询需要的数据

其中条件A和B是页面上用户的输入(选择),



    <when test="name != null">
        <choose>
                <when test="name == 'hello'" >
                  从A表查询
                </when>
                <when test="name == 'world'" >
                  从B表查询
                </when>
                <when test="name == 'hello-world'" >
                  从ABC三表联查
                </when>
                <otherwise>
                  从ABCDEFG表联查
                </otherwise>  
        </choose>            
    </when>



问题是,如果你查询的目标表都不确定的话,<select>返回结果对象,你只能映射成map,除非你能确保始终查询出的结果集能和实体类属性做了一一对应的resultMap
0 请登录后投票
   发表时间:2011-12-20  
你的IBatis白学了。。
0 请登录后投票
   发表时间:2011-12-20  
这种情况需要写两个Dao,在业务逻辑层根据条件选择调用不同的Dao
0 请登录后投票
   发表时间:2011-12-21  
george_space 写道
四书五经 写道
[color=green]现在的需求是:
if(条件A)
  从表A,C里查询需要的数据
else if(条件B)
   从表B,C里查询需要的数据

其中条件A和B是页面上用户的输入(选择),



    <when test="name != null">
        <choose>
                <when test="name == 'hello'" >
                  从A表查询
                </when>
                <when test="name == 'world'" >
                  从B表查询
                </when>
                <when test="name == 'hello-world'" >
                  从ABC三表联查
                </when>
                <otherwise>
                  从ABCDEFG表联查
                </otherwise>  
        </choose>            
    </when>



问题是,如果你查询的目标表都不确定的话,<select>返回结果对象,你只能映射成map,除非你能确保始终查询出的结果集能和实体类属性做了一一对应的resultMap

可以用<asscoation>时间一对一关联
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics