`

一个很方便的Hibernate自动拼装条件工具类

阅读更多
每做一个新的模块都要写一大堆组装查询条件的逻辑代码,不小心有一个条件没有用ignocase,又是一个BUG,可能你早已烦透了。

首先来看效果吧:
先看这个有六个条件的URL: 
.../findUsers.action?user.realName=lgd&user.phone=&user.age=20&user.age=30&user.organization.name=技术部&user.birthday=1980

用下面一行可以完成所有条件的封装

//三个参数分别是:pojo类,请求参数的前辍,别名     
//其中前辍是,如果URL参数写成formBean.user.realName,那么前缀为
//formBean.user;当URL参数写成user.realName,那么前缀就是user
DetachedCriteria c = DetachedCriteriaUtil.createDetachedCriteria(User.class, "user", "u")
//前缀的作用是,所有以此开头的URL参数才会被考虑用来拼装条件


   具体用法:下载附件JAR包并导入到工程中,然后在任何地方使用上面那一句即可。

   工具类做了这几件事:
1、根据属性类型对各种值转型。
2、年龄条件有两个,即20和30,因为是数值,自动使用>=和<=。
3、对于所在部门的名称,是个关联表字段,先创建别名,再拼条件。这个特点还支持无限级联,比如你可以写一个很变态的URL参数aaa.bbb.ccc.ddd.eee.name=fff,只要你的实体确实有种关联,就可以拼装。
4、手机字段条件没有输入值,不作为条件。
5、对于生日这个条件,组装成>=19800101000000 and <=19801231235959

    上面那一行把除了分页外的工作都做了,你已经可以拿这个criteria去查询了,如果你不想分页的话。分页逻辑可在此基础上进行封装,不在此讨论范围内。hibernate打出的SQL类似这样:

   
select ...... from sys_user user inner join sys_organization org on user.organization_id=org.id where user.real_name like ? and user.age>=? and user.age<=? and org.name like ? user.birthday>=? and user.birthday<=?



此工具类功能包含:
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}取值。


此工具依据功能不同有三个同名的方法,上面是第一种,只具有自动拼装条件功能,下面是剩下两个方法的介绍

		//第二种:前三个参数同上,多加一个字符串数组,表示只需要查询这部份属性,是属性名,不是字段名
		criteria = DetachedCriteriaUtil.createDetachedCriteria(User.class, "user", "_user", new String[]{"id","realName"});
		//SQL如下:select u.id , u.real_name from sys_user...
		
		//第三种:在前面的基础上再加一个数组,表示不希望作为查询条件的请求参数
		//如url为../index.action?user.realName=lgd&user.password=123,
		//此时如果不想要password这个查询条件,那么这个数组定义为new String[]{"user.password"}
		criteria = DetachedCriteriaUtil.createDetachedCriteria(User.class, "user", "_user", new String[]{"id","realName"},new String[]{"user.password"});
		




库依赖说明:
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、类图:
  • 大小: 151.9 KB
分享到:
评论
12 楼 lgdlgd 2010-03-23  
deng_1987 写道
我猜想 楼主的实现机制,也应该是反射原理。
  我实现过。只需要传送实体对象就行(里面属性有地有值有地没值)。通过反射机制,拼接SQL语句,然后用setProperties(实体)就行



嗯,拼HQL肯定也是可以的,一样的道理嘛,呵呵,但是不知道拼完HQL后,如果还想手工往里加一些条件会不会比较困难? 而这种情况应该是有的,例如一些很固定的逻辑,比如某一类型的查询,都必须带上这个条件,而这个条件又不是URL参数的一部份。
11 楼 deng_1987 2010-03-23  
拼接HQL语句 上面写错了
10 楼 deng_1987 2010-03-23  
我猜想 楼主的实现机制,也应该是反射原理。
  我实现过。只需要传送实体对象就行(里面属性有地有值有地没值)。通过反射机制,拼接SQL语句,然后用setProperties(实体)就行
9 楼 lgdlgd 2010-03-22  
deng_1987 写道
你也可以应用放射机制,写一个hql语句,然后setProperties()


你的意思是说也写一个自动拼装HQL的工具类吗,以前没有这种想法,不知道你是不是做了?
8 楼 deng_1987 2010-03-22  
你也可以应用放射机制,写一个hql语句,然后setProperties()
7 楼 lirenjiede 2010-03-21  
下来看下哈
6 楼 yin_bp 2010-03-20  
bboss group project contain follow subprojects:
1.bboss-persistent, a persistent framework.
参考bbossgroups框架来实现持久层的操作:
a.灵活的事务管理(声明式事务管理,可编程事务管理,java注解事务管理,jdbctemplate事务管理,五种经典的事务类型,支持事务嵌套,支持多数据库分布式事务)
b.灵活的访问数据库的接口(普通sql操作,预编译sql操作,普通/预编译批处理操作,存储过程,函数)
c.一套经典的数据库操作标签库(增删改查,普通sql操作,预编译sql操作,普通/预编译批处理操作)
d.经典的多数据库连接池配置管理和使用方法(所有的数据库操作接口可以直接指定连接池的名称,方便地实现对不同数据库的操作)
e.提供了简单的o/r mapping查询接口
f.提供了多种行处理器来提升查询操作的性能
g.可以方便地实现blob,clob字段的处理
h.提供分页操作接口(预编译和普通),可以方便地址各种数据库的分页操作
2.bboss-taglib, a web layer taglib framework(list tag,pageine list tag,detail tag ,logic tag,tree tag,tabpane tag,dbutil tag).
3.bboss-aop, an aop framework.(ioc ,rpc[jms,mina,jgroups,cxf webservice,restful],bean component,cxf webservice component framworkset and so on).
4.bboss-event, an event framework(local event,remote distribute event framework base aop rpc framework).
5.bboss-util, an utility framework.
6.antbuildall, ant build project that build up projects.
7.bbossevent-client, an event remote client test project.
8.bboss-client, an rpc client test project.(jms,mina,jgroups,cxf webservice,restful).
9.bboss-ws, bboss webserive framework test project.
10.bbossgroups document 目录包含framework 开发文档和bboss aop框架的技术使用文档

bboss group project blog:
http://blog.csdn.net/yin_bp
http://yin-bp.iteye.com/

bboss group project sourceforge site url:
http://sourceforge.net/projects/bboss/files/

从bbossgroup 1.0开始,已经将以前的持久层框架,aop框架,标签库框架,事件框架,工具框架,全部作为bbossgroup 的子项目一起发布
新增antbuildall [ant complile for all bboss group projects],可以运行antbuildall下的run.bat命令编译所有的子项目,并且更新相应工程
的引用jars。


release version : bbossgroups-1.0
release date: 2010/03/18
release files:Contain all sub projects source files,distribute files,All projects dependended jars,So the file size is some bigger,do not warry,every sub project can be downloaded alone.

bbossgroups 最新版本 1.0,整合了原来所有的子项目(持久层框架,标签库框架,aop框架,事件框架),下载地址:
https://sourceforge.net/projects/bboss/files/

5 楼 lgdlgd 2010-03-19  
Angel_Night 写道
说实话...楼主发帖没多久我就收藏了...

当时觉得也提不出什么好建议,就没回帖...当时,过去这么久都没人理?


多谢捧场,呵呵,可能大家都有自已一套实现了吧,我也不知道做个的我是第几个人...
4 楼 Angel_Night 2010-03-19  
说实话...楼主发帖没多久我就收藏了...

当时觉得也提不出什么好建议,就没回帖...但是,过去这么久都没人理?
3 楼 lgdlgd 2010-03-19  
引用
看了下,好像只能用于struts2,假如没有使用struts2你这个工具包就没有用了~!


上面说得很明白,依赖xwork.core.2.16包,如果不用Struts2,那么只要这个包就可以,另外要改写RequestUtil类,以提供获得当前请求的方法
2 楼 yourfei 2010-03-19  
看了下,好像只能用于struts2,假如没有使用struts2你这个工具包就没有用了~!
1 楼 walle1027 2010-03-19  
谢谢楼主分享,正在研究源码中

相关推荐

    SQL组装工具类,轻松应对复杂查询条件的组装

    SQL组装复杂查询条件,SELECT .. FROM .. (LEFT|RIGHT|INNER) JOIN .. ON .. WHERE .... GROUP BY .. HAVING .. ORDER BY .. LIMIT ..

    SqlUtils工具类,Sql IN 条件拼接工具类

    `SqlUtils`工具类是Java开发中用于处理SQL语句拼接的一个实用工具,特别是针对包含`IN`条件的查询。在数据库操作中,`IN`关键字常用于筛选满足特定集合条件的记录。例如,假设我们需要查找ID在一组值中的用户,我们...

    java 数据拼装树工具类

    2. **数据转换**:该工具类应包含方法,接收一个列表或其他数据结构(如JSON数组),并将其转换为TreeNode对象的列表。这可能涉及到对数据的遍历、解析和对象实例化。 3. **构建树结构**:工具类的核心是构建树结构...

    hibernate实现动态SQL查询

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑解耦,从而提高开发效率。本篇文章主要探讨如何利用Hibernate实现动态SQL查询,结合XML配置和FREEMARKER模板...

    XML 解析与拼装工具类

    基于Dom4j的Xml解析与组装项目工具类.

    SQL语句拼装工具V2

    写java程序时用来拼装sql语句时使用的小工具,在.net 4.0环境下运行。 跟前一版本比较,增加了前缀和空格位置的自定义,并增加了一个配置文件,保存自定义项 例如将 select a, b, c from abc where a like('3') ...

    spring+hibernate,自己封装了原生sql的处理,模仿mybatis使用

    2. 创建一个解析器类,用于读取这些映射文件并将SQL语句与Java方法绑定。 3. 在Service层中调用解析器方法,执行相应的SQL操作。 4. 结合Spring的事务管理,确保数据操作的一致性和原子性。 从"只有controller和...

    TBM后配套管片拼装机建模及分析

    而ADAMS软件则是一个广泛使用的机械系统动力学仿真工具,可以帮助设计师进行运动学和动力学的分析。 三维设计及分析的过程包括以下几个重要方面: 1. 管片拼装机建模:首先,使用CATIA软件进行管片拼装机的三维...

    基于深度学习视觉和激光辅助的盾构管片自动拼装定位方法.docx

    本文探讨的是基于深度学习视觉和激光辅助的盾构管片自动拼装定位方法,这是针对隧道建设中关键步骤——管片拼装的一项技术创新。管片的精确拼装直接影响隧道的质量、安全、防水性能和耐久性。随着大直径盾构机的广泛...

    ftp上传工具类+登录+样例

    `FtpUploadUtil.java`可能就是这样一个工具类,它提供了静态方法供调用者进行FTP操作。 2. FTP登录认证:在使用FTP服务前,需要进行登录操作,这涉及到用户名和密码的验证。FTP有两种模式:主动模式(Port)和被动...

    一种预拼装钢构件的点云自动分割算法.docx

    "一种预拼装钢构件的点云自动分割算法" 摘要: 预拼装钢构件点云自动分割算法是一种基于点云处理技术的算法,旨在解决预拼装钢构件的点云数据自动分割问题。该算法首先对预处理后的空间点云进行降维投影,然后采用...

    SQL语句拼装工具

    写java程序时用来拼装sql语句时使用的小工具,在.net 4.0环境下运行。例如将 select a, b, c from abc where a like('3') 转换为: sql.append("select "); sql.append(" a, "); sql.append(" b, "); sql.append...

    行业文档-设计装置-一种可快速拼装的工具式梯子.zip

    行业文档-设计装置-一种可快速拼装的工具式梯子

    MySQL查询把多列返回结果集拼装成一个字段

    mysql中有种可以通过join相关操作进行表与表之间的方式查询不同结果集,但是在一对多的情况下,关键查询的结果是多条的.例如:班级和学习的关系,我想很直观的看到班级和学生的情况,列表显示出班级的信息和班级的男生...

    仿valuelist式动态sql拼装

    2. `SqlUtil.java`: 这很可能是一个自定义的工具类,包含了动态SQL拼装的核心逻辑。通常,这个类会包含方法如`buildSql(String template, List&lt;Object&gt; params)`,用于接收一个SQL模板字符串和一个参数列表,然后...

    易语言SQL拼装1.1 链式编程, 拼装SQL方法

    于是决定用易语言模仿一个, 这个版本只支持 "生成拼装SQL", 下次准备结合ad0o对象. 允许直接操作数据库。制作这么一个东西的初衷是为了 "更快更高效的开发程序", 我们往往在SQL上耽搁了太多时间. 并不是它难. 而是...

    行业分类-设备装置-一种拼装式电缆电热墙体.zip

    标题中的“行业分类-设备装置-一种拼装式电缆电热墙体”表明这是一个关于设备装置领域的技术文档,具体是关于拼装式电缆电热墙体的设计或应用。这种电热墙体通常用于建筑领域,通过电缆加热方式提供室内取暖,具有...

    电子-一种电控开关滑槽式拼装窗

    标题中的“电子-一种电控开关滑槽式拼装窗”指的是一个电子技术应用的创新设计,具体来说,它是一种采用电控开关机制的滑槽式拼装窗户系统。这种窗户设计结合了现代电子技术和传统的门窗结构,为建筑领域带来了智能...

    小颗粒积木拼装积木图纸免费电子说明书7款

    总的来说,“小颗粒积木拼装积木图纸免费电子说明书7款”是一个宝贵的资源,不仅为爱好者提供了方便,也促进了积木拼装的教育和娱乐价值。无论你是初次接触还是资深玩家,都可以从中找到乐趣和挑战。

    行业分类-设备装置-一种可拼装、拆解的桥梁检测工作平台.zip

    标题中的“行业分类-设备装置-一种可拼装、拆解的桥梁检测工作平台”表明了这个压缩包的内容是关于机械设备领域,特别是针对桥梁检测的一种创新工作平台设计。这种平台的特点在于它的可拼装和可拆解性,这在实际应用...

Global site tag (gtag.js) - Google Analytics