reflection 是 java 程序开发语言的特征之一,它允许运行中的程序对自身进行访问,并能直接操作程序的内部属性。
hibernate是一个面向java环境的对象/关系数据库映射工具,基本上,每个表或者视图在hibernate里面都可以对应一个类,在此处,我们通过充分的利用这个类,来实现动态组合查询。
首先我们一起来看看这个函数的源代码:
/** * 组合查询 * @param object 包含查询条件的对象 * @param firstresult 第一个返回的位置(从0开始) * @param maxresults 最大返回数 * @param orderfield 排序的字段 * @param isabs 是否正序排列 * @return * @throws hibernateexception */ public list querylist(object object, int firstresult, int maxresults,string orderfield ,boolean isasc) throws hibernateexception,illegalargumentexception,illegalaccessexception,invocationtargetexception { list list=null; class c = object.getclass(); method method[] = c.getmethods(); try { session session = currentsession(); criteria criteria = session.createcriteria(object.getclass()); for (int i = 0; i < method.length; i++) { string name = method[i].getname(); if(name.indexof("getmin")==0){ //大于 string fieldname = name.substring(6, 7).tolowercase() + name.substring(7); object retobj = method[i].invoke(object, null); if (retobj != null && !retobj.equals("")) criteria.add(expression.ge(fieldname, retobj)); continue; } if(name.indexof("getmax")==0){//小于 string fieldname = name.substring(6, 7).tolowercase() + name.substring(7); object retobj = method[i].invoke(object, null); if (retobj != null && !retobj.equals("")) criteria.add(expression.le(fieldname, retobj)); continue; } if (name.indexof("get") != 0 || name.indexof("getclass") == 0) //如果不是需要的方法,跳出 continue; string fieldname = name.substring(3, 4).tolowercase() + name.substring(4); string returntype = method[i].getreturntype().tostring(); object retobj = method[i].invoke(object, null); if (retobj != null) { //如果为null,没有赋值,跳出 if (returntype.indexof("string") != -1){ if(retobj.equals("")) //如果为""的string字段,跳出 continue; criteria.add(expression.like(fieldname, "%" + retobj + "%")); //对string的字段,使用like模糊查询 }else criteria.add(expression.like(fieldname, retobj)); } } if(isasc) criteria.addorder(order.asc(orderfield)); //升序 else criteria.addorder(order.desc(orderfield)); //降序 criteria.setfirstresult(firstresult); criteria.setmaxresults(maxresults); list = criteria.list(); } finally { closesession(); }
return list; }
假设关系数据库里面有一个物理表,其结构如下:
staff(员工表)
列名
类型
null
说明
id(pk)
varchar2(20)
not null
员工工号
name
varchar2(20)
not null
员工姓名
dept
integer
null
员工所属部门(p3)
password
varchar2(20)
not null
密码
post