Hibernate的检索方式

本文详细介绍了HQL(Hibernate Query Language)在Hibernate框架中的使用方法,包括查询条件设定、投影查询、分页查询、连接查询、分组查询等特性,并对比了HQL的list()和iterate()方法在结果集处理上的区别。此外,文章还阐述了如何使用HQL进行动态绑定参数和OID检索方式,以及如何通过别名简化查询语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HQL(Hibernate Query Language)

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

1、  在查询语句中设定各种查询条件

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

方式一:

@Test

    public void find(){

        //投影查询

        Sessionsession=HibernateUtil.getSession();

            Iterator<Object[]>it= session.createQuery("selectc.petName,c.realName from Customers as c").iterate();

        while(it.hasNext()){

        Object[]c=it.next();

     System.out.println("petName===="+c[0]+"realName==="+c[1]);

         }

    }

方式二:

@Test

           public void find1(){

            //投影查询

           Sessionsession=HibernateUtil.getSession();

           List<Object[]> list= session.createQuery("select c.petName,c.realName from Customers asc").list();

           for(Object[] c:list){

           System.out.println("petName===="+c[0]+"realName==="+c[1]);

               }

           }

  Query的两个方法,list() 和 iterate() , 两个方法都是把结果集列出来, 他们有3点不一样,

1):返回的类型不一样,list()返回List,iterate()返回Iterator,

2): 获取数据的方式不一样,list()会直接查数据库,iterate()会先到数据库中把id都取出来,然后真正要遍历某个对象的时候先到缓存中找,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1。

3):iterate会查询2级缓存, list只会查询一级缓存。

4): list()中返回的List中每个对象都是原本的对象,iterate()中返回的对象是代理对象.

list()方法在执行时,直接运行查询结果所需要的查询语句。

iterator()方法则是先执行得到对象ID的查询,然后在根据每个ID值去取得所要查询的对象。

因此:对于list()方式的查询通常只会执行一个SQL语句,而对于iterator()方法的查询则可能需要执行N+1条SQL语句(N为结果集中的记录数).

结果集的处理方法不同:

list()方法会一次取出所有的结果集对象,而且他会依据查询的结果初始化所有的结果

集对象。如果在结果集非常庞大的时候会占据非常多的内存,甚至会造成内存溢出的情况发生。

iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来

初始化对象。一次在访问中可以控制缓存中对象的数量,以避免占用过多的缓存,导致内存溢出情况的发生。

3、  支持分页查询

4、  支持连接查询[自然连接,左连接,右连接,内连接(不知道mysql是否支持内连接)]

5、  支持分组查询, 允许使用 HAVING 和 GROUP BY 关键字

6、  提供内置聚集函数, 如 sum(),min() 和max()

7、  能够调用 用户定义的 SQL 函数或标准的 SQL 函数

8、  支持子查询[一个条件查询的结果作为另一个条件查询的条件]

9、 支持动态绑定参数[可以为占位符赋值]

OID检索方式

         按照对象的OID来检索对象

QBC检索方式

使用 QBC(Query ByCriteria) API 来检索对象. 这种API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口.

简单的查询:

         使用HQL查询

         Query query=session.createQuery("from Customers");     

    List<Customers>customers=query.list();

 

//方法链编程

Customers customer=(Customers) session.createQuery("from Customers as c where c.petName=?").setString(0, "bbb").list().get(0);

使用别名:

    通过HQL检索一个类的实例时,如果查询语句的其他地方需要引用它,应该为这个类指定一个别名

from Customers as c where c.name=:customer

注:as可省略

 

绑定参数的形式,按参数名绑定:

@Test

    public void findAll2(){

       //检索出所有的用户

       Session session=HibernateUtil.getSession();

       Query query=session.createQuery("from Customers as c where c.petName=:name");//sql 面向对象的sql 语句

      

       query.setString("name", "bbb");//第一个参数是占位符的名称,第二个参数:参数的值      

       //遍历出所有的查询结果

       Iterator<Customers> it=query.iterate();

       while(it.hasNext()){

           Customers customer=it.next();

           System.out.println(customer.toString());

       }  

}

 

注:以上的方法仅为hibernate中检索方式的一部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值