我们的做法:
我们的项目基于hibernate的,如下基于hibernate NamedQuery扩展。
2 <sql-query name="hr_searchOrganInfo">
3 <![CDATA[
4 from HrOrganInfo
5 where 1=1
6 #[and createDate>=? and createDate<=?]
7 #[and ORGAN_NO like ?]
8 #[and ORGAN_NAME like ?]
9 #[and IS_ACTIVE=?]
10 ]]>
11 </sql-query>
12
13 <sql-query name="hr_loadOrganTree">
14 <![CDATA[
15 select b.ORGAN_NO,b.ORGAN_NAME,b.PRE_ORGAN_NO,0 AS TYPE
16 from HR_ORGAN_INFO b
17 where 1=1
18 #[and b.ORGAN_NO=?]
19 #[and b.IS_ACTIVE=?]
20 union
21 select b.ORGAN_NO,b.ORGAN_NAME,b.PRE_ORGAN_NO,0 AS TYPE
22 from HR_ORGAN_INFO a,HR_ORGAN_INFO b
23 where 1=1
24 #[and a.ORGAN_NO=b.PRE_ORGAN_NO and (a.ORGAN_NO=? or b.PRE_ORGAN_NO=a.ORGAN_NO)]
25 #[and b.IS_ACTIVE=?]
26 ]]>
27 </sql-query>
对于不定的查询条件以#[和]标记对,支持嵌套
我们的调用过程:
2
3 * 分页方式查询机构信息
4
5 * @param organInfoVO
6
7 * @param pageModel
8
9 * @return
10
11 * @throws Exception
12
13 */
14
15 public PaginationModel searchOrganInfo(OrganInfoVO organInfoVO,
16
17 PaginationModel pageModel) throws Exception {
18
19 return this.findPageByhql("hr_searchOrganInfo", null, new Object[] {
20
21 organInfoVO.getBeginDate(),
22
23 organInfoVO.getEndDate(),
24
25 organInfoVO.getOrganNo(),
26
27 organInfoVO.getOrganName(),
28
29 organInfoVO.getIsActive() },
30
31 pageModel);
32
33 }
在我们BaseDAOSupport中提供findPageByHql以及其它大量针对数据库查询的方法,在方法调用时只需要将参数完整化的以对象数组(或List),对于如状态选择:-1表示全部等特性,以及blank值的处理,我们提供了convertSqlParams(objects),convertSqlParams(obj,new Object[-1,""]),判断对象为空或-1则转为null,用法:
2
3 organInfoVO.getBeginDate(),
4
5 organInfoVO.getEndDate(),
6
7 organInfoVO.getOrganNo(),
8
9 organInfoVO.getOrganName(),
10
11 convertSqlParams(organInfoVO.getIsActive() ,-1)},
12
13 pageModel);
14
15 }
当然也可以批量转(转""为null)
2
3 organInfoVO.getBeginDate(),
4
5 organInfoVO.getEndDate(),
6
7 organInfoVO.getOrganNo(),
8
9 organInfoVO.getOrganName(),
10
11 organInfoVO.getIsActive() }),
12
13 pageModel);
14
15 }
实现原理很简单(个人觉得这只是一个idea不属于技术范畴,说穿了谁都能实现只是实现的代码简繁而已),判断#[]中的问号所对应的参数是否为null(当然考虑like 和is,like将值直接替换进去,is 判断数据类型是否为null以及boolea类型,不是则将#[]内容切除),为null将#[]内容切除,是则将#[和]标记用""替换掉,这样整体
代码实现起来优雅简单,sql语句的可读性和可维护性大大增强!
当然你会找出一个极其变态难处理的sql整合(目前我们项目中还没有遇到),我们这个东西怎么做呢?其实
findPageByhql("hr_searchOrganInfo",param..param),第一个参数既可是是NamedQuery也可以是sql(hql)语句,自己组合咯,特殊问题特殊对待。
sagacity的宗旨在于不强迫你改变你的习惯,考虑特殊情况,为开发提供方便!
sagacity代码这几天整理一下,重新划分一下,将标签部分独立出来,减少耦合性将尽快对大家提供后台开发所需要的代码!