关于hibernate中的HQL查询语言

来源:互联网 发布:金山网络优化大师 编辑:程序博客网 时间:2024/06/06 04:42

HQL: hibernate query language
HQL 是一种面向对象的查询语言,它的语法和SQL有些类似,HQL是在运行时才得以解析,HQL不是像SQL那样是
数据操作语言,它是用来取对象,而不是用来执行 update , delete , insert 等操作。

1:简单的HQL查询:
    Query   query = session.createQuery(" from   Person ");
        List    list = query.list();
        //查询所有的 Person对象时,最简单的HQL语句就是 from Person
        //注意:如果Person类在别的包中也有同名的类,此时要写类全名,或设auto_import="false"

2:属性查询
        有时进行查询时不需要得到对象的所有属性,这时我们可以进行属性查询
        Query query = session.createQuery(" select p.name from Person p " );
        //利用这种HQL语句查询出来的结果中,就只包含需要的指定的属性值
        如果查询两个以上的属性值时,查询出来的结果会以数组的方式返回
        Query query = session.createQuery(" select p.name , p.age from Person as p ");
        List   list = query.list();
        for(int i=0; i<list.size(); i++){
         Object obj[] = (Object[])list.get(i);
         System.out.println("name===="+ obj[0]);
         System.out.println("age ===="+ obj[1]); }
3:实例化查询:
        实例化查询其实是对属性查询的一种改进,示例如下:
      Query query = session.createQuery(" select new Person(p.name , p.age) from Person p");
      List   list = query.list();
      for(int i=0; i<list.size(); i++){
      Person p = (Person)list.get(i);
      System.out.println("name===="+ p.getName() );
      System.out.println("age ===="+ p.getAge() ); }
4:连接查询:
      HQL支持内联接,外连接,交叉连接它也和SQL一样,其它HQL是从SQL演化而来的,很多SQL支持的语句
HQL都支持,大家有时间可以多测试下,以下就主要针对 left join fetch 与 left join 为重点讲述:
     Query query = session.createQuery(" from Company c left join c.employees ");
     //如果纯粹的用 left join 查询出来的结果是一个对象数组
     List   list = query.list();
     Object [] obj = null;     
     for(int i=0; i<list.size(); i++){
     obj =(Object[] ) list.get(i);     //集合取出的全部是对象数组
     Company com = (Company)obj[0];    //对象数组中取出的第一个元素是Company对象
     Employee emp = (Employee)obj[1];} //对象数组中取出的第二个元素是Employee对象
如果改用 left join fetch 来修改以上的 HQL语句的话:
      Query query = session.createQuery(" from Company c left join fetch c.employees ");
      则从集合取出来的元素全部为 Company对象
对比总结:
left join fetch 加载一那端中的集合中的元素,返回的是一那端类型的对象,使用fetch和不使用fetch 的关键所在就在于,虽然Company对employees集合是延迟加载的,但是在HQL中使用fetch来进行预先抓取,从而保存Company中的集合也被初始化了,从而在session之外访问集合中的元素不会造成LazyException

5:其它方式的查询:
    HQL中也支持一些关于SQL中类似通配符样式的查询方式,此外HQL还支持一些SQL中的统计函数的使用。关于Criteria查询接口的使用等等这方面的知识,建议大空有时间多去看下hibernate-reference一书中的关于查询的介绍。