`
NeverGiveUpToChange
  • 浏览: 43220 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Hibernate提供以下几种检索对象的方式

 
阅读更多
Hibernate提供以下几种检索对象的方式。

l         导航对象图检索方式。(根据已经加载的对象,导航到其他对象。)

l         OID检索方式。(按照对象的OID来检索对象。)

l         HQL检索方式。(使用面向对象的HQL查询语言。)

l         QBC检索方式。(使用QBC(Qurey By Criteria) API来检索对象。)

l         本地SQL检索方式。(使用本地数据库的SQL查询语句。)



一、Hibernate的检索方式简介

1、HQL检索方式

HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言有些相识。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。它具有以下功能:

l         在查询语句中设定各种查询条件。

l         支持投影查询,即仅检索出对象的部分属性。

l         支持分页查询。

l         支持分组查询,允许使用having和group by关键字。

l         提供内置聚集函数,如sum()、min()和mac()。

l         能够调用用户定义的SQL函数。

l         支持子查询,即嵌入式查询。

l         支持动态绑定参数。

Session类的find方法及Qurey接口都支持HQL检索方式。区别在于,前者只是执行一些简单HQL查询语句的便捷方法,它不具有动态绑定参数的功能,而且在将来新的Hibernate版本中,有可能淘汰find方法;而Qurey接口才是真正的HQL查询接口,它提供了以上列出的各种查询功能。

       注:Qurey接口支持方法链编程风格,它的set方法都返回自身实例,而不是返回void类型。方法链编程风格能使程序代码更加简洁。

示例代码:
    Query query = session           .createQuery("from Customer as c where "           +"c.name=:customerName and c.age=:customerAge");    // 动态绑定参数    query.setString("customerName", "Test");    query.setInteger("customerAge", 21);    // 执行检索    List result = query.list();     // 方法链编程风格    List result1 = session.createQuery(           "from Customer as c where c.name=:customerName"                  + " and c.age=:customerAge").setString(           "customerName", "Test").setInteger("customerAge", 21)

           .list();


2、QBC(Qurey By Criteria)检索方式

       采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。QBC API提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Expression类组成,它支持在运行时动态生成查询语句。

示例代码:
    Criteria criteria = session.createCriteria(Customer.class);    Criterion criterion1 = Expression.like("namr", "T%");    Criterion criterion2 = Expression.eq("age", new Integer(21));    criteria = criteria.add(criterion1);    criteria = criteria.add(criterion2);    // 执行检索    List result = criteria.list();     // 方法链编程风格    List result1 = session.createCriteria(Customer.class).add(           Expression.like("namr", "T%")).add(

           Expression.eq("age", new Integer(21))).list();


       Hibernate还提供了QBE(Qurey By Example)检索方式,它是QBC的子功能。QBE允许先创建一个随想模板,然后检索出和这个样板相同的对象。

示例代码:
    Customer exampleCustomer=new Customer();    exampleCustomer.setAge(21);     List result1 = session.createCriteria(Customer.class).add(

           Example.create(exampleCustomer)).list();


       QBE的功能不是特别强大,仅在某些场合下有用。一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后返回匹配的对象。QBE只支持“”和“”比较运算符,无法不大区间值,及其或的匹配。在这种情况下,还是采用HQL检索方式或QBC检索方式。


3、SQL检索方式

       采用HQL或QBC检索方式时,Hibernate生成标准的SQL查询语句,使用于所有的数据库平台,因此这两种检索方式都是跨平台的

       有的应用程序可能需要根据底层数据库的SQL方言,来生成一些特殊的查询语句。在这种情况下,可以利用Hibernate提供的SQL检索方式。

示例代码:
    Query query = session.createSQLQuery("select {c.*} from CUSTOMER as c where c.NAME like :customerName and c.AGE=:customerAge");    // 动态绑定参数    query.setString("customerName", "Test");    query.setInteger("customerAge", 21);    // 执行检索

    List result = query.list();


4、使用别名

       通过HQL检索一个类时,如果查询语句的其他地方需要引用它,应该为这个类指定一个别名,as关键字用于设定别名,也可以将as关键字省略。

       QBC检索不需要由应用程序显式指定类的别名,Hibernate会自动把查询语句中的跟结点实体赋予别名“this”。


5、多态查询

       HQL和QBC都支持多态查询,多态查询是指查询出当前类及所有子类的实例。多态查询对接口也使用。Hibernate不仅对from子句显式指定的类进行多态查询,而且对其他关联的类也会进行多态查询。


6、对查询结果排序

       HQL和QBC都支持对查询结果进行排序。

query = session.createQuery("from Customer as c order by c.name");
    //排序    criteria.addOrder(Order.asc("name"));

    criteria.addOrder(Order.desc("age"));


7、分页查询

       Query和Criteria接口都提供了用于分页显式查询结果的方法。

l         setFirstResult(int firstResult):设置从那个对象开始检索,参数表示这个对象在查询结果中的索引位置,索引位置的起始值为0。默认从0检索。

l         setMaxResult(int maxResults):设置一次最多检索出的对象数目。默认检索所有。

示例代码:
    criteria = criteria.add(criterion1);    criteria = criteria.add(criterion2);    criteria.setFirstResult(0);    criteria.setMaxResults(10);            // 执行检索

    List result = criteria.list();
     query.setString("customerName", "Test");    query.setInteger("customerAge", 21);    query.setFirstResult(0);    query.setMaxResults(10);            // 执行检索

    List result = query.list();


8、检索单个对象

       Query和Criteria接口都提供了以下用于查询语句并返回查询结果的方法。

l         list()方法:返回一个List类型的查询结果。

l         uniqueResult()方法:返回单个对象。


注:Query接口还提供了一个iterate()方法,它和list()方法一样,能返回所有满足条件的持久化对象,但是两者使用不同的SQL查询语句。

示例代码:
    // 单个检索    Customer customer = (Customer) session.createQuery(           "from Customer as c order by c.name").setMaxResults(1)

           .uniqueResult();
     // 单个检索    Customer customer = (Customer) session.createCriteria(

           Customer.class).setMaxResults(1).uniqueResult();

       如果明明知道一个对象,可以不调用setMaxResults(1)方法。


9、在HQL查询语句中绑定参数

       A、按参数名字绑定。咋HQL中定义命名参数以“:”开头。

       B、按照参数位置绑定。在HQL查询语句中用“?”来定义参数的位置。

示例代码:
    Query query = session.createQuery("from Customer as c where "           + "c.name=? and c.age=?");    // 动态绑定参数    query.setString(0, "Test");

    query.setInteger(1, 21);


       除了以上用于绑定映射类型的参数的方法,Hibernate还提供了以下三个特殊的参数绑定方法。

(1)setEntity()方法:把参数与一个持久化类的实例绑定。(用id关联)

(2)setParameter()方法:绑定任意类型的参数。

(3)setProperties()方法:用于把命名参数与一个对象的属性值绑定。


10、在映射文件中定义命名查询语句(略)
分享到:
评论

相关推荐

    JSP开发中hibernate框架的常用检索方式总结

    1、hibernate框架的检索方式有以下几种: OID检索:根据唯一标识OID检索数据 对象导航检索:根据某个对象导航查询与该对象关联的对象数据 HQL检索:通过query接口对象查询 QBC检索:通过criteria接口对象查询 ...

    基于JSP struts2和hibernate3的 图书馆管理系统 包括读者和图书的基本管理和检索、排序.zip

    Java的主要特点和优势包括以下几个方面: 跨平台性(Write Once, Run Anywhere): Java的代码可以在不同的平台上运行,只需编写一次代码,就可以在任何支持Java的设备上执行。这得益于Java虚拟机(JVM),它充当了...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...

    java面试题

    多线程几种实现方法,同步? 答:多线程有两种实现方法,一种是继承Thread类或者实现Runnable接口。同步就是在方法返回类型后面加上synchronized。 c#中的委托,事件是不是委托? 答:委托就是将方法作为一个参数...

    整理后java开发全套达内学习笔记(含练习)

    以“%”开头,[第几个数值$][flags][宽度][.精确度][格式] printf()的引入是为了照顾c语言程序员的感情需要 格式化输出 Formatter;格式化输入 Scanner;正则表达式 输出格式控制: 转义符: \ddd 1到3位8...

    java开源包1

    提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...

    java开源包11

    提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...

    java开源包2

    提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...

    java开源包3

    提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...

    java开源包6

    提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...

    java开源包5

    提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...

    java开源包10

    提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...

    java开源包4

    提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...

    java开源包8

    提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...

    java开源包7

    提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...

    java开源包9

    提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...

    java开源包101

    提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...

    Java资源包01

    提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java...

    JAVA上百实例源码以及开源项目

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    达内总结的java最新笔试题core java,sql,web应有尽有

    7.目前几种主流数据库软件的应用特点、适用范围各是什么? 8.存储过程和函数的区别 9.试述数据库完整保护的主要任务和措施。 10.请说明SQLServer中delete from tablea & truncate table tablea的区别 11. Oracle安装...

Global site tag (gtag.js) - Google Analytics