服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

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


    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

扫描关注微信公众号