首页 > 学院 > 开发设计 > 正文

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

2019-11-18 13:50:52
字体:
来源:转载
供稿:网友

    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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表