每做一个新的模块都要写一大堆组装查询条件的逻辑代码,不小心有一个条件没有用ignocase,又是一个BUG,可能你早已烦透了。
首先来看效果吧: 先看这个有六个条件的URL: .../findUsers.action?user.realName=lgd&user.phone=&user.age=20&user.age=30&user.organization.name=技术部&user.birthday=1980 用下面一行可以完成所有条件的封装 Java代码
具体用法:下载附件JAR包并导入到工程中,然后在任何地方使用上面那一句即可。 工具类做了这几件事: 1、根据属性类型对各种值转型。 2、年龄条件有两个,即20和30,因为是数值,自动使用>=和<=。 3、对于所在部门的名称,是个关联表字段,先创建别名,再拼条件。这个特点还支持无限级联,比如你可以写一个很变态的URL参数aaa.bbb.ccc.ddd.eee.name=fff,只要你的实体确实有种关联,就可以拼装。 4、手机字段条件没有输入值,不作为条件。 5、对于生日这个条件,组装成>=19800101000000 and <=19801231235959 上面那一行把除了分页外的工作都做了,你已经可以拿这个criteria去查询了,如果你不想分页的话。分页逻辑可在此基础上进行封装,不在此讨论范围内。hibernate打出的SQL类似这样: Sql代码
此工具类功能包含: 1、根据请求参数自动组装条件--组装结果是DetachedCriteria对象。 2、部份属性查询--即支持只查表中部份字段,且支持无限级联。 3、范围值的自动拆分,如日期,如查询条件中对日期字段只给出一个值,那么会被拆分成两个,只有年份的,拆成当年第0秒和当年最后一微秒,有年月的,拆分成当月第0秒和当月最后一微秒,以此类推,因为你永远不可能拿仅有4位年份构造出工一个日期来和数据库进行相等比较,那不会是客户要的结果。对于数字型的字段,一个值时,进行相等比较,两个值时,进行between比较,不支持多于两值。 4、支持或条件组装,如URL为 user.realName|user.age=35,那么SQL为user.real_name=? or user.age=?。注意这时目标页面无法用${user.realName|...}取回原值,可以用${realName}取值。 此工具依据功能不同有三个同名的方法,上面是第一种,只具有自动拼装条件功能,下面是剩下两个方法的介绍 Java代码
库依赖说明: 1、xwork.core.2.16包,struts2.18版本带有此包,代码里面用到它的一个OnglUtil工具将查询结果组装成List<Pojo>,另外RequestUtil类使用ActionContext类取得当前请求,仅此两处依赖xwork包。 2、hibernate3.x,这是必不可少的。 补充: 1、支持除了java.sql.Date、Map属性外的所有常用类型属性条件拼装,要支持这两种只需要依葫芦画瓢实现IValueHandler接口就行了。 2、只要改写AliasToBean类,很容易支持Struts2.0x版本。 3、集合属性需为泛型。 4、支持POST提交表单。 5、类图: ![]() |
|
来自: KILLKISS > 《Hibernate》