`
ahang8415
  • 浏览: 46358 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论
阅读更多

Hibernate QBC查询
            QBC查询:
               QBC查询就是通过使用Hibernate提供的Query By Criteria
            API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。我们看下面的示例程序:
            Criteria criteria=session.createCriteria(User.class);
            criteria.add(Expression.eq(“name”,”zx”));
            criteria.add(Expression.eq(“age”,new Integer(27));
            List list=criteria.list();
            当执行criteria.list()时会生成类似这样的SQL语句:Select * from user where name=’zx’
            and
            age=27;所以在这里我们可以看出,Criteria实际上是一个查询容器,它对查询条件表达式的添加进行了封装,具体的查询条件是通过add()方 法添加的,而且具体的查询条件的表达式运算是通过Expression指定的。Hibernate在运行期会根据Criteria指定的表达式条件来添加 查询条件,并且生成查询语句。这种方式非常符合Java以及所有面向对象编程语言的编程方式,所以大多数的持久层框架都提供了对这种方式查询的支持。下面 我们讲解这种查询方式的各个技术细节。
            1、Criteria查询表达式:
            正如我们所见,Expression对查询语句的表达式进行了封装和限制,下表列出了Expression所有的方法,以及每个方法所对应的查询表达式及其限制。
                  方法描述
                  Expression.eq对应SQL的“field=value”表达式
                  如:Expression.eq(“name”,”zx”);
                  Expression.allEq方法的参数为一个Map类型对象,包含多个名/值对对应关系,相当于多个Expression.eq的叠加
                  Expression.gt对应SQL的“field>value”表达式
                  Expression.ge对应SQL的“field>=value”表达式
                  Expression.lt对应SQL的“field”表达式
                  Expression.le对应SQL的“field<=value”表达式
                  Expression.between对应SQL语句的between表达式,如:查询年龄在21与27岁之间的用户,可以写成Expression.between(“age”,new
                  Integer(21),new Integer(27));
                  Expression.like对应SQL语句的”field like value”表达式
                  Expression.in对应SQL语句的“field in(……)”表达式
                  Expression.eqProperty用于比较两个属性值,对应”field=field”SQL表达式
                  Expression.gtProperty用于比较两个属性值,对应”field>field”SQL表达式
                  Expression.geProperty用于比较两个属性值,对应”field>=field”SQL表达式
                  Expression.ltProperty用于比较两个属性值,对应”field表达式
                  Expression.leProperty用于比较两个属性值,对应”field<=field”SQL表达式
                  Expression.and对应SQL语句的And关系组合,如:Expression.and(Expression.eq(“name”,”zx”),Expression.eq(“sex”,”1”));
                  Expression.or对应SQL语句的Or关系组合,如:Expression.or(Expression.eq(“name”,”zx”),Expression.eq(“name”,”zhaoxin”));
                  Expression.sql作为补充这个方法提供了原生SQL语句查询的支持,在执行时直接通过原生SQL语句进行限定,如:Expression.sql(“lower({alias}.name)
                  like (?)”,“zhao%”,Hibernate.STRING) ;在运行时{ alias
                  }将会由当前查询所关联的实体类名替换,()中的?将会由”zhao%”替换,并且类型由Hibernate.STRING指定。

            注意:Expression各方法中的属性参数(各方法中的第一个参数)所指定的属性名称(如:name,sex),并不是数据库表中的实际字段名称,而是实体对象中映射实际数据表字段的类属性名称。
            
            2、示例查询:
              
            示例查询是通过Example类来完成的,Example类实现了Criterion接口,可以用作Criteria查询条件,Example类的作用是:根据已有对象,查询属性值与之相同的其他对象。如下代码所示:
            Criteria criteria=session.createCriteria(User.class);
            User exampleuser=new User(“zx”);
            criteria.add(Example.create(exampleuser));
            List list=criteria.list();
            for(int i=0;i
               User user=(User)list.get(i);
               System.out.println(user.getName()+”\n”);
            }
            上述代码中User exampleuser=new
            User(“zx”);criteria.add(Example.create(exampleuser));两句相当于
            criteria.add(Expression.eq(“name”,”zx”));因此会生成类似如下的SQL语句:
            select * from user where name=’zx’;在上面的代码中exampleuser称为示例对象。
             
            在Hibernate中队示例查询,默认情况下会排除掉示例对象中属性值为空的属性,还可以调用Example.excludeNone(排除空串 值)/excludeZeros(排除零值),或者调用Example.excludeProperty方法来指定排除特定属性。
              
            示例查询主要应用于组合查询中,比如根据用户输入的查询条件动态生成最终的查询语句,通过使用示例查询,可以避免由于查询条件过多而写的大量if判断语句。
            3、复合查询:
            复合查询主要是处理,具有关联关系的两个实体怎样进行关联查询,比如User实体对象与Addres实体对象具有一对多的关联关系,我们可以如下构造符合查询:
            Criteria criteria=session.createCriteria(User.class);
               Criteria addcriteria=criteria.createCriteria(“addresses”);(1)
               addcriteria.add(Express.like(“address”,”%tianjin%”));
              List list=criteria.list();
               for(int i=0;i
                 User user=(User)list.get(i);
                 System.out.println(user.getName()+”\n”);
                 Set addresses=user.getAddresses();
                 Iterator it=addresses.iterator();
                 while(it.hasNext(){
                  Address address=(Address)it.next();
                  System.out.println(address.getAddress()+”\n”);
                 }
               }
            当执行到了(1)处时,表明要针对User对象的addresses属性添加新的查询条件,因此当执行criteria.list()时,Hibernate会生成类似如下的SQL语句:
            Select * from user inner join address on user.id=address.id where
            address.address like ‘%shanghai%’;
            正如我们所见,我们可以通过向Criteria中添加保存关联对象的集合属性(addresses属性保存与User对象相关联的Address对象),来构造复合查询,在数据库一端是通过内连接查询来实现。
            
            
            
            4、Criteria的高级特性:
            A、限定返回记录条数:
             我们可以通过利用Criteria.setFirstResult/setMaxResult方法来限定返回某一次查询的记录数,如下代码:
            Criteria criteria=session.createCriteria(User.class);
            criteria.setFirstResult(100);
            criteria.setMaxResult(200);
            通过以上代码可以设定该次查询返回user表中的从第100条记录开始直到第200条记录结束的100条记录。
            B、对查询结果进行排序:
             可通过使用net.sf.hibernate.expression.Order类可以对查询结果集进行排序,如下面代码:
            Criteria criteria=session.createCriteria(User.class);
            criteria.add(Expression.eq(“groupid”,”2”);
            criteria.addOrder(Order.asc(“name”));
            criteria.addOrder(Order.desc(“groupid”));
            List list=criteria.list();
            通过使用Order类的asc()/desc()方法,可以指定针对某个字段的排序逻辑,如果执行上述代码,会生成类似如下的SQL语句:
            Select * from user where groupid=’2’ order by name asc,groupid desc
            C、分组与统计:
              
            在Hibernate3中,对Criteria又增添了新功能,可以支持分组与统计功能,在Hibernate3中增加了Projections以及ProjectionList类,这两个类对分组与统计功能进行了封装,如下代码:
            Criteria criteria=session.createCriteria(User.class);
            criteria.setProjection(Projections.groupProperty(“age”));(1)
            List list=criteria.list();
            Iterator it=list.iterator();
            while(it.hasNext()){
             System.out.println(it.next());
            }
            通过(1)处的代码,我们通过Projections类指定了用于分组的目标属性,当进行检索时Hibernate会生成类似如下的SQL语句:
            Select age from user group by age;
            还可以通过使用Projections的avg()/rowCount()/count()/max()/min()/countDistinct()等方法来实现统计功能,如下面的代码示例:
            Criteria criteria=session.createCriteria(User.class);
            criteria.setProjection(Projections.avg(“age”));(1)
            List list=criteria.list();
            Iterator it=list.iterator();
            while(it.hasNext()){
             System.out.println(it.next());
            }
            通过(1)处的代码,我们实现了对用户平均年龄的统计,当进行检索时,Hibernate会生成类似如下的SQL语句:
            Select avg(age) from user;
            另外,在SQL语句中的多条件分组与统计功能,可以利用ProjectionList类来实现,如下面代码所示:
            Criteria criteria=session.createCriteria(User.class);
            ProjectionList prolist=Projections.projectionList();
            prolist.add(Projections.groupProperty(“age”));
            prolist.add(Projections.rowCount());
            criteria.setProjection(prolist);
            List list=criteria.list();
            通过以上代码,实现了对不同年龄人员数量的分组统计,当进行检索时,Hibernate会生成类似如下的SQL语句:
            Select age,count(*) from user group by age;
            5、DetachedCriteria:
            在Hibernate2中,Criteria实例是与创建它的Session实例具有相同的生命周期的,也就是说,Session实例是它所创建的 Criteria实例的宿主,当Session关闭时,寄生于Session实例的Criteria都将失效。这就对Criteria的重用造成了困难, 为了实现Criteria实例的重用,在Hibernate3中提供了一个DetachedCriteria类,DetachedCriteria实例的 生命周期与Session实例的生命周期无关,我们可以利用DetachedCriteria对一些常用的Criteria查询条件进行抽离,当需要进行 检索时再与Session实例关联,从而获得运行期的Criteria实例。如下面的代码所示:
               DetachedCriteria dc= DetachedCriteria.forClass(User.class);
               dc.add(Expression.eq(“name”,”zhaoxin”));
               dc.add(Expression.eq(“sex”,”1”));
               Criteria criteria=dc.getExecutableCriteria(session);
               Iterator it=criteria.list().iterator();
               while(it.hasNext()){
                 User user=(User)it.next();
                 System.out.println(user.getName());
               }
            
            正如我们所见,DetachedCriteria的生存周期与session实例无关,当需要进行检索时,通过 getExecutableCriteria(session)方法,与当前的Session实例关联并获得运行期的Criteria实例,完成检索。
            DetachedCriteria也可以用于完成子查询功能,如下代码所示:
            DetachedCriteria dc= DetachedCriteria.forClass(User.class);
            dc.setProjection(Projections.avg(“age”));
            Criteria criteria=session.createCriteria(User.class);
            criteria.add(Subqueries.propertyGt(“age”,dc));
            List list=criteria.list();
            通过Subqueries类,实现了添加子查询的功能,我们将DetachedCriteria所设定的查询条件,当作子查询添加到了运行时Criteria实例的查询条件中,当执行检索时Hibernate会生成类似如下的SQL语句:
            Select * from user where age>(select avg(age) from user group by
            age);

分享到:
评论

相关推荐

    qbc表达式

    ### QBC表达式:比较运算符详解 在IT领域中,特别是数据库操作方面,QBC(Query by Criteria)是一种常用的技术手段,它提供了一种灵活的...同时,这也要求我们在实际应用中不断学习和实践,才能更好地掌握这些技巧。

    QBC查询的别名方的

    根据提供的文件信息,我们可以推断出此文档主要讨论了QBC(Query By Criteria)查询方法在Hibernate框架中的应用。...通过这些内容的学习,可以帮助开发人员更好地理解和运用QBC查询,提高查询效率和准确性。

    Hibernate QBC高级查询.rar

    通过深入学习和实践“Hibernate QBC高级查询”,开发者可以更高效、灵活地处理数据查询任务,提高代码的可读性和可维护性。提供的资源“Hibernate QBC高级查询.wps”应该包含详细的讲解和示例代码,帮助你掌握这些...

    Hibernate_QBC和Hibernate_QBE

    **标题与描述解析** 标题"Hibernate_QBC和Hibernate_QBE"提及了两个关于Hibernate的查询方式,即Query By ...通过深入学习和实践,开发者能够更好地利用Hibernate的特性,优化数据库操作,提升应用程序的性能。

    本科毕业论文—面向智能胎心监护的QBC主动学习算法设计研究+论文.pdf

    本科毕业论文—面向智能胎心监护的QBC主动学习算法设计研究 本文研究旨在解决智能胎心监护中的两个主要问题:即CTG数据不平衡和初 始样本集未经挑选、信息量不足。为解决这两个问题,本文提出了基于自适应 遗传K-...

    Java_Hibernate QBC条件查询对比

    但是,对于简单的查询,HQL的语法可能比QBC显得更冗长,学习曲线也较陡峭。 在实际开发中,如何选择QBC和HQL,往往取决于项目需求和团队成员的熟悉程度。对于那些强调快速开发、查询条件较为简单的项目,QBC可能是...

    Hibernate-HQL-QBC-QBE

    标题中的“Hibernate-HQL-QBC-QBE”涵盖了四个重要的Java持久化框架Hibernate中的概念,分别是...在学习和使用过程中,参考官方文档、博客文章(如给出的博文链接)以及其他开发者的经验分享,都是非常有益的。

    Hibernate实例开发 HQL 与 QBC 查询

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了数据库...在学习和实践中,理解并熟练掌握这两者,将极大地提升你的Hibernate开发能力。

    QBC主动采样学习在垃圾邮件在线过滤中的应用 (2014年)

    针对垃圾邮件在线过滤的实际应用,在委员会投票算法采样学习的基础上,提出动态提升采样门槛,在无标签样本池中阶梯式获取高信息量训练样本的方法。该方法能够在稳定识别精度的前提下,进一步降低用于标注和学习的...

    基于QBC主动学习方法建立电信客户信用风险等级评估模型 (2007年)

    针对建立客户信用风险等级分类模型时,大量带有类标注数据难以获得的问题,提出了基于主动学习的分类器建模方法,并对基于QBC(委员会投票选择)的主动学习算法进行改进以提高分类器的预测精度。通过对实际电信客户...

    Hibernate学习笔记(3)

    - **语法简洁**:HQL的语法接近于标准SQL,易于理解和学习。 - **面向对象**:HQL支持面向对象的操作,如对象的属性访问、集合的处理等。 - **动态构建查询**:可以通过程序动态地构建HQL查询字符串,实现复杂的查询...

    论文研究-结合半监督与主动学习的时间序列PU问题分类.pdf

    针对以上问题,提出一种采用主动学习对未标注数据集[U]中数据进行人工标注从而构建分类器的方法OAL(Only Active Learning),基于投票委员会(QBC)对标注数据集构建多个分类器进行投票,以计算未标注数据样本的...

    qbc:QBasic 到 JavaScript 转换器

    QBasic,全称Quick Basic,是Microsoft在1980年代推出的一种基于BASIC编程语言的简化版本,旨在提供一个易于学习和使用的编程环境。它具有直观的语法和丰富的内置函数,是初学者学习编程的首选。然而,随着Web技术的...

    Hibernate学习笔记和资料

    hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置...hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式

    FPGA XILINX 使用说明

    通过这个简单的工程实例,读者可以逐步学习和掌握FPGA设计的基本步骤,包括硬件描述语言编程、引脚约束设定、逻辑综合和硬件实现。随着对Xilinx ISE的熟练运用,可以逐步设计更复杂的功能,充分利用Virtex-4 FPGA的...

    一种基于主动学习的新型电子鼻学习技术:EQBC-RBFNN

    QBC 是一种特定类型的主动学习策略,它通过多个学习器组成的“委员会”来决定哪些样本应该被标注。这些学习器在未标注样本集上产生不同的预测结果,当它们的意见出现分歧时,就会挑选出这些样本进行人工标注。这样...

    Hibernate学习资料

    7. **HQL与QBC查询** Hibernate Query Language (HQL) 是面向对象的查询语言,类似于SQL但操作对象而非表格。Query By Criteria API提供了另一种查询方式,更直观且无需书写字符串查询语句。 8. **缓存机制** ...

    SSH培训纲要--培训的课程目标,课程大纲,课程安排

    掌握HQL和QBC查询语言,以及Log4j日志系统。对于Hibernate的缓存机制,包括一级缓存和二级缓存也需要有深入的理解。 课程的安排会按照从基础知识到实践操作的顺序进行,确保学员从理论到实践逐步掌握SSH框架的使用...

    浪磬J2EE第一期 Hibernate专题 第六讲 检索方式

    通过深入学习和实践,我们不仅能提升数据库操作的灵活性,还能更好地应对复杂业务场景,为项目开发带来显著的便利。在本讲中提供的资料,如"PPT"和"源码",将帮助我们更深入地理解和应用这些知识。

Global site tag (gtag.js) - Google Analytics