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