网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  利用java reflection(反射)原理,在hibernate里面实现对单表、视图的动态组合查询     
  文章作者:未知  文章来源:水木森林  
  查看:78次  录入:管理员--2007-11-17  
 
    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
 
 
上一篇: 利用 java web start发布你用java程序    下一篇: 利用java 创建和读取excel文档
  相关文档
如何编写enterprise bean的客户端 11-17
一个象棋手机游戏的源代码 11-17
技术分析:使用eclipse进行swt编程(图) 11-17
struts的文件上传 11-17
java规则引擎-drools 11-17
java servlet api说明文档 11-17
关于有状态和无状态会话bean的解释 11-17
最大限制地提高代码的可重用性 11-17
java上加密算法的实现用例 11-17
用java自制手机联网游戏 11-17
技术分享 使用xml-rpc来访问web服务 11-17
java版的md5 11-17
改写equals的时候遵守约定 11-17
经典j2ee开发工具-ibmeclipse简史 11-17
java 理论与实践: 关于异常的争论 11-17
在学习编程的过程中,应该注意什么 11-17
用 jdom 简化 xml 编程 11-17
使用布局管理器 呈现生动的java程序界面 11-17
编写自己的缓冲区溢出利用程序 11-17
给经理们的.net讲座 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息