Hibernate查询方式知多少 一

来源:互联网 发布:淘宝商家同意退货流程 编辑:程序博客网 时间:2024/04/20 20:46

Hibernate查询方式

说到hibernate的查询方式,我们自然而然就想到了它——hql,hibernate query language.hql是使用hibernate框架的变成配朋友们使用最多的一种方式,它以自身的独特的优势:屏蔽数据库,书写灵活的优点,备受大家的青睐。但是Hibernate不仅给我们提供了这一种查询方式,这时候悠然要说来,是不只一种,还有sql,对,确实还有sql,但是还有一种,就是Criteria 查询。那么今天,我们就来聊一聊hibernate的几种查询方式。
Hibernate的查询方式有六种:Hql,Sql,Criteria,DetachedCriteria,QBE(query by example),命名查询。这里我们就说说种Hibernate常用的查询方式的使用及其利弊。

一、 HQL查询

hql是最常用的,有如下优点:

  • 写起来灵活直观;
  • 与大家熟悉的SQL的语法差不太多,所以上手快。
    条件查询、分页查询、连接查询、嵌套查询,写起来与SQL语法基本一致,其它的,包括一些查询函数(count(),sum()等)、查询条件的设定等,也都跟SQL语法差不太多。
  • 与SQL的不同的就是把表名换成了类名。
    如以前我们查询的是t_user表,现在我们使用User这个实体就可以找到t_user表,这也是ORM框架的最大的特色,面向对象

弊端:

  • 仅适用于hibernate框架,适用面小。

PS: 在hql中关键字不区分大小写,但是属性和类名区分大小写。

接下来,我们看示例代码:

static void queryTest(String name){  Session s=null;  try  {    s=HibernateUtil.getSession();        //from后面是对象,不是表名   String hql="from Admin as admin where admin.aname=:name";//使用命名参数,推荐使用,易读。   Query query=s.createQuery(hql);   query.setString("name", name);       List<Admin> list=query.list();       for(Admin admin:list)   {     System.out.println(admin.getAname());    }  }finally{    if(s!=null)    s.close();   }  }

二、对象化查询Criteria方法

这种方式比起HQL来说更加的面向对象,不需要我们写任何的查询语句,hql也好,sql也好,我们就只需要告诉session,我们要查询什么,条件是什么。
一般需要以下三个步骤:

1、 使用Session实例的createCriteria()方法创建Criteria对象
2、使用工具类expression的方法为Criteria对象设置查询条件;
Order工具类的方法设置排序方式;
Projections工具类的方法进行统计和分组。
3、使用Criteria对象的list()方法进行查询并返回结果

这种查询的优点是:

  • 面向对象操作。
    革新了以前的数据库操作方式,易读。

缺点:
- 适用面相对于HQL来说有限。
因为面向对象 了,那么封装严了,同时灵活性方面就相对的减少了,因为目前提供的工具类中还不能像直接写hql语句那么灵活。

以下是操作示例:

static void qbc(String name,String password){   Session session=null;   try{    session=HibernateUtil.getSession();        Criteria criteria=session.createCriteria(Admin.class);    //eq是等于,gt是大于,lt是小于,or是或    criteria.add(expression.eq("aname",name));    criteria.add(expression.eq("apassword", password));        List<Admin> list=criteria.list();    for(Admin admin:list){    System.out.println(admin.getAname());    }   }finally{    if(session!=null)    session.close();   }  }

以上两种查询方式的优点:

  • 都是对数据库透明的操作方式,即我们不必为后期换数据库而担心,付出维护sql的工作量。

缺点:

  • 有些数据特性的东西无法利用。

三、SQL 查询

这种查询方式,我就不需要过多的解释了,就是我们原生的SQL语句进行查询。看例子

static List sql() {   Session s = HibernateUtil.getSession();   Query q = s.createSQLQuery("select * from user").addEntity(User.class);   List<User> rs = q.list();   s.close();   return rs;  }

优点:

  • 随心所欲写出需求的sql的语句,完全灵活。

缺点:

  • 对数据库不透明。
    对于不同的数据库,写出来的sql是不同的,如果需要换数据库,那就得重写sql。

使用场合:系统不需要换数据库的情况下,还是sql使用方便,效率高。

以上是三种查询方式,下篇博客我们继续DetachedQuery,命名查询方式。

0 0