Java知识点13 Hibernate查询语言(HQL),本文以hibernate注解版为例讲解

Posted dshore123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java知识点13 Hibernate查询语言(HQL),本文以hibernate注解版为例讲解相关的知识,希望对你有一定的参考价值。

1、简单概述          

1.1、

1) SQL:面向的是数据库 select * from tableName;
2) HQL查询(Hibernate Query language): hibernate 提供的面向对象的查询语言。
    例:Session.createQuery(“from tableName”)  //和第1)点的SQL语句恒等的,查询出来的效果是一样的
3) Criteria 查询,完全面向对象的查询(Query By Criteria  ,QBC)
4) SQLQuery, 本地SQL查询,逻辑比较复杂,HQL很难实现

      缺点:不能跨数据库平台,如果改了数据库,sql语句有可能要改
      使用场景: 对于复杂sql,hql实现不了的情况,可以使用本地sql查询

HQL查询要注意:
      1、使用hql查询的时候 auto-import="true" 要设置true,如果是false,写hql的时候,要指定类的全名,例如:
           1.1、 Query q = session.createQuery("from Employee"); //auto-import="true"的时候
            1.2、Query q = session.createQuery("from com.shore.model.Employee"); //auto-import="false"的时候

       2、用注解版时,auto-import="true" (默认为true)写不写类的全名,都是可以的。用xml 配置版时,需要指定 auto-import="true" ,这样省代码,不指定为true,则像上面第1点的第1.2小点那样写。

1.2、查询全部列

1 Query query = session.createQuery("from Employee"); //OK
2 Query query = session.createQuery("from com.shore.model.Employee"); //OK
3 Query query = session.createQuery("select * from Employee"); //错误,不支持 *
4 Query query = session.createQuery("select e from Employee e"); // OK
5 System.out.println(query.list()); //把结果打印到控台上

1.3、查询指定的列

1 Query query = session.createQuery("select name,sex,salary from Employee");
2 System.out.println(query.list());

1.4、查询指定的列,自动封装为对象

1 Query query = session.createQuery("select new com.shore.model.SubEmployee(name,sex,salary) from Employee");
2 System.out.println(query.list());

1.5、条件查询

  1.5.1、条件查询之占位符(?)

1 Query query = session.createQuery("select new com.shore.model.SubEmployee(name,sex,salary) from Employee where department_id = ?");
2 //query.setParameter(0, 1);//或者下面的setInteger(0, 1)方法也行
3 query.setInteger(0, 1);
4 System.out.println(query.list());

  1.5.2、条件查询之命名参数(:

1 Query query = session.createQuery("select new com.shore.model.SubEmployee(name,sex,salary) from Employee where department_id = :deptID");
2 query.setParameter("deptID", 1);
3 System.out.println(query.list());

  1.5.3、条件查询之范围查询(between .... and  ... )

1 Query query = session.createQuery("select new com.shore.model.SubEmployee(name,sex,salary) from Employee where department_id between :d1 and :d2");
2 query.setParameter("d1", 1);   //也可以用占位符?实现
3 query.setParameter("d2", 2);
4 System.out.println(query.list());

  1.5.4、条件查询之模糊查询   like

1 Query query = session.createQuery("select new com.shore.model.SubEmployee(name,sex,salary)  from Employee where name like ?");
2 query.setParameter(0, "%三%");
3 System.out.println(query.list());

1.6、聚合函数统计

1 Query query = session.createQuery("select count(*) from Employee where name like ?");
2 query.setParameter(0, "%三%");
3 System.out.println(query.list());

1.7、分组查询(group by

1 Query query = session.createQuery("select department,count(*) from Employee group by department_id"); //根据部门外键
2 System.out.println(query.list());

1.8、连接查询 (内连接、外连接、左/右连接等)

  内连接:Join == inner join  //交集
  左连接:Left join,以左边的表为主表,如果没有join上,左边表数据完整,右边表的数据可能为空 。//左边表的所有数据+右边表的交集部分
  右连接:Right join,以右边的表为主表,如果没有join上,右边表数据完整,左边表的数据可能为空。//右边表的所有数据+左边表的交集部分
  外连接:Outer join  //并集

 1 1) 内连接   【映射已经配置好了关系,关联的时候,直接写对象的属性即可】
 2 Query q = session.createQuery("from Employee e inner join e.department"); //department是Employee实体中映射的一个外键(Employee表中的department_id)
 3 
 4 2) 左外连接
 5 Query q = session.createQuery("from Employee e left join e.department");
 6 
 7 3) 右外连接
 8 Query q = session.createQuery("from Department d right join d.employee"); //映射的一个外键(employee_id)
 9 
10 4) 迫切内连接    【使用fetch, 会把右表的数据,填充到左表对象中!】
11 Query q = session.createQuery("from Employee e inner join fetch e.department");
12 q.list();
13         
14 5) 迫切左外连接
15 Query q = session.createQuery("from Employee e left join fetch e.department");

1.9、HQL查询优化

1 Query query = session.getNamedQuery("getAllDept"); //定义一个参数名 getAllDept
2 query.setParameter(0, 10);

  然后在对应的xml 配置文件中 写SQL语句。(对于发杂的SQL语句,可以这样做,方便项目发布后,还可以修改)

1 比如在:Employee.hbm.xml 在xml中存放sql语句 2     <query name="getAllDept">  //这里的参数名 getAllDept 要和上面的对应
3         <![CDATA[
4             from Employee d where department_id < ?;  //这里写SQL语句,不是HQL语句
5         ]]>
6     </query>

2、HQL查询语言 实例  

 

 

 

 

 

 

 

 

原创作者:DSHORE

作者主页:http://www.cnblogs.com/dshore123/

原文出自:https://www.cnblogs.com/dshore123/p/11546575.html

欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

以上是关于Java知识点13 Hibernate查询语言(HQL),本文以hibernate注解版为例讲解的主要内容,如果未能解决你的问题,请参考以下文章

JPA+Hibernate+Mysql查询语言问题

Java面试题:Hibernate的二级缓存与Hibernate多表查询

Java:如何解决 Hibernate 查询语言中的类未映射异常?

java之hibernate之hibernate查询

Hibernate 之强大的HQL查询

HIBERNATE知识复习记录4-HQL和QBC