精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-12-18
表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中怎样按条件选择不同的表来执行查询呢? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-12-19
个人觉得按照条件来替换表名不方便,当前使用可能很好,如果今后有需求变更就麻烦了。
还不如根据条件调用不同的service这样的接口进行选择 |
|
返回顶楼 | |
发表时间:2011-12-19
建议在代码里做判断、数据组合,SQL处理虽然简单,但后患无穷,扩展、效率都是麻烦
|
|
返回顶楼 | |
发表时间:2011-12-20
可以参考一下bboss持久层动态sql语句使用方法,很好地实现你的要求
|
|
返回顶楼 | |
发表时间:2011-12-20
建议根据用户不同的选择,调用不同的server执行不同的逻辑。
|
|
返回顶楼 | |
发表时间: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> 返回字段可以用别名统一就可以了 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2011-12-20
你的IBatis白学了。。
|
|
返回顶楼 | |
发表时间:2011-12-20
这种情况需要写两个Dao,在业务逻辑层根据条件选择调用不同的Dao
|
|
返回顶楼 | |
发表时间: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>时间一对一关联 |
|
返回顶楼 | |