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

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

原文地址:https://www.cnblogs.com/dshore123/p/11588358.html

时间: 2024-11-09 09:51:30

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

【HQL】hibernate查询语言hql

hibernate查询语言hql 在hql中关键字不区分大小写,通常小写,类的名称和属性名称必须区分大小写 1.简单属性查询[重要] * 单一属性查询,返会属性结果集列表,元素类型和实体类中相应的类型一致 * 多个属性查询,多个属性查询返会对象数组,对象数组的长度取决于属性的个数 对象数组中元素的类型取决于属性在实体类中的类型 * 如果认为返会数组不够对象化,可以使用hql动态实例化Student对象 参见:SimplePropertyQueryTest.java 2.实体对象查询[重要] *

Hibernate查询语言——HQL

HQL(Hibernate Query Language)查询语言是完全面向对象的查询语言,它提供了更加面向对象的封装,可以理解如多态.继承和关联. HQL的基本语法如下: select "对象.属性名" from "对象" where "过滤条件" group by "对象.属性名" having "分组条件" order by "对象.属性名"

027 hibernate查询语言(HQL)

概述:数据查询与检索是Hibernate中的一个亮点,相对其他ORM实现而言,Hibernate提供了灵活多样的查询机制. 标准化对象查询(Criteria Query):以对象的方式进行查询,将查询语句封闭为对象操作.优点:可主动性好,符合Java程序员的编码习惯.缺点:不够成熟,不支持投影(projection)或统计函数(aggregation) n   例:查询用户名以“J”开头的所有用户 Criteria c = session.createCreateria(User.class);

spring mvc+hibernate 实现事务管理(全注解版)

为了方便项目变大配置文件变多,用注解代替 *.hbm.xml,<bean id="*dao" class="">,另外用反省实现dao操作,省去每个类一个dao,此处参考了鸵鸟的例子. 实现功能跟http://blog.csdn.net/waiwai4701/article/details/38270721这个项目是一样的,controller和页面就不再写 首先,jar包支持,为了方便jar包管理采用maven技术,服务器没有用tomcat用的jett

Hibernate查询语言

HQL(Hibernate Query Language)查询语言是完全面向对象的查询语言,它提供了更加面向对象的封装,它可以理解如多态.继承和关联的概念.HQL看上去和SQL语句相似,但它却提供了更加强大的查询功能. 1. 了解HQL语言 HQL语句与SQL语句是相似的,其基本的使用习惯也与SQL相同.由于HQL是面向对象的查询语言,说以它需要从目标对象中查询信息并返回匹配单个实体对象或多个实体对象的集合,而SQL语句是从数据库表中查找指定的信息,返回的是单条信息或多条信息的集合. 注意:HQ

HQL: Hibernate查询语言

HQL: Hibernate查询语言 Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承.多态 和关联之类的概念. 第 15 章 HQL: Hibernate查询语言 Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承.多态 和关联之类的概念. 15.

类型:。net;问题:HQL;结果:HQL: Hibernate查询语言

HQL: Hibernate查询语言 Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承.多态 和关联之类的概念. 第 15 章 HQL: Hibernate查询语言 Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承.多态 和关联之类的概念. 15.

Hibernate 的查询语言 HQL 与高级查询

Hibernate  的查询语言 HQL  与高级查询 数据库操作实现类的开发 import java.util.List; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.Transaction; import org.sf.dao.IDepartmentDao; import org.sf.entity.Departmen

Java知识点11 Hibernate多对多单向关联(Annotation+XML实现)

1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,但是老师不知道自己教哪些学生时,可用单向关联的多对多模式 1.2.创建Teacher类和Student类 1 package com.shore.model; 2 3 import javax.persistence.Entity; 4 import javax.persistence.GeneratedValue; 5 import javax.persistence.Generati