现在的位置: 首页 > 综合 > 正文

Hibernate的检索方式

2013年08月09日 ⁄ 综合 ⁄ 共 2578字 ⁄ 字号 评论关闭

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中检索方式的一部分

抱歉!评论已关闭.