技术开发 频道

开创性的陈氏数据库动态查询设计

  我们的做法:

  我们的项目基于hibernate的,如下基于hibernate NamedQuery扩展。

1 <hibernate-mapping>
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>

     对于不定的查询条件以#[和]标记对,支持嵌套

  我们的调用过程:  

1/**
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,用法:  

1return this.findPageByhql("hr_searchOrganInfo", null, new Object[] {
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)

  

1return this.findPageByhql("hr_searchOrganInfo", null, convertSqlParams(new Object[] {
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代码这几天整理一下,重新划分一下,将标签部分独立出来,减少耦合性将尽快对大家提供后台开发所需要的代码!

0
相关文章