WEB开发网
开发学院WEB开发Jsp 利用Java Reflection(反射)原理,在hibernate里面... 阅读

利用Java Reflection(反射)原理,在hibernate里面实现对单表、视图的动态组合查询

 2008-01-05 09:31:05 来源:WEB开发网   
核心提示: Reflection 是 java 程序开发语言的特征之一,它答应运行中的程序对自身进行访问,利用Java Reflection(反射)原理,在hibernate里面实现对单表、视图的动态组合查询,并能直接操作程序的内部属性, Hibernate是一个面向Java环境的对象/关系数据库映射工具,跳出 if (r

   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

Tags:利用 Java Reflection

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接