HQL 查询
hql对数据库的查询语句
hql对数据库的查询语句HQL是Hibernate Query Language的缩写,是Hibernate框架中用于数据库查询的一种查询语言。
HQL语句类似于SQL语句,但是它面向对象,直接操作对象而不是表。
下面列举了10个常用的HQL查询语句示例:1. 查询所有记录:```hqlSELECT * FROM 表名```2. 查询指定字段的记录:```hqlSELECT 字段1, 字段2 FROM 表名```3. 条件查询:```hqlSELECT * FROM 表名 WHERE 条件```4. 模糊查询:```hqlSELECT * FROM 表名 WHERE 字段 LIKE '%关键字%'```5. 分页查询:```hqlSELECT * FROM 表名 LIMIT 起始位置, 每页数量```6. 排序查询:```hqlSELECT * FROM 表名 ORDER BY 字段 ASC/DESC```7. 连接查询:```hqlSELECT * FROM 表1, 表2 WHERE 表1.字段 = 表2.字段```8. 统计查询:```hqlSELECT COUNT(*) FROM 表名```9. 分组查询:```hqlSELECT 字段, COUNT(*) FROM 表名 GROUP BY 字段```10. 子查询:```hqlSELECT * FROM 表名WHERE 字段IN (SELECT 字段FROM 表名WHERE 条件)```以上是一些常用的HQL查询语句示例,通过使用不同的关键字和语法结构,可以实现各种复杂的查询需求。
在实际使用中,可以根据具体情况调整查询语句,灵活运用HQL来满足业务需求。
总结一下,HQL是Hibernate框架中用于数据库查询的一种查询语言,它类似于SQL语句,但是更加面向对象。
通过使用不同的关键字和语法结构,我们可以实现各种复杂的查询需求,例如条件查询、模糊查询、分页查询、排序查询、连接查询、统计查询、分组查询和子查询等。
hql查询语句
hql查询语句
HQL是Hibernate Query Language(Hibernate查询语言)的缩写,它是一种基于对象的查询语言,可用于查询Hibernate映射的实体对象。
HQL查询语句使用与SQL相似的语法结构,但是它是针对对象而不是针对关系数据库的。
HQL查询语句通常以关键字"from"开始,后跟实体类的名称或别名。
例如:
```
from er
```
这将返回一个包含所有User实体对象的查询结果集。
HQL还支持使用条件表达式来过滤查询结果。
例如:
```
from er where name = 'John'
```
这将返回一个包含所有名为"John"的User实体对象的查询结果集。
HQL还可以使用聚合函数来计算查询结果集的统计信息。
例如:
```
select count(*) from er
```
这将返回一个包含User实体对象数量的查询结果集。
HQL还支持使用连接查询和子查询等高级查询功能。
例如:
```
from er u left join u.orders o where o.totalPrice > 100
```
这将返回一个包含所有订单总价大于100的User实体对象的查询结果集。
总之,HQL是一个灵活强大的对象查询语言,可以用于各种类型的查询需求。
hql 关联查询写法
hql 关联查询写法HQL(Hibernate Query Language)是Hibernate 中使用的查询语言,它是一种面向对象的查询语言,与数据库无关。
在HQL 中,关联查询通过对象的关联来完成。
下面是一个简单的HQL 关联查询的写法示例,假设有两个实体类`Author` 和`Book`,它们之间存在一对多的关联关系(一个作者可以有多本书):```java@Entitypublic class Author {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@OneToMany(mappedBy = "author", cascade = CascadeType.ALL)private Set<Book> books = new HashSet<>();// 省略其他属性和方法}@Entitypublic class Book {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String title;@ManyToOne@JoinColumn(name = "author_id")private Author author;// 省略其他属性和方法}```现在,假设我们要查询作者及其所著书籍的信息,可以使用HQL 来完成这个关联查询:```javaString hql = "FROM Author A JOIN FETCH A.books";Query query = session.createQuery(hql);List<Author> authors = query.getResultList();for (Author author : authors) {System.out.println("Author: " + author.getName());Set<Book> books = author.getBooks();for (Book book : books) {System.out.println("Book Title: " + book.getTitle());}}```在这个例子中,使用`JOIN FETCH` 关键字来进行关联查询,同时通过`A.books` 来指定关联的属性。
hqlinfo语句大全
hqlinfo语句大全HQL(Hibernate Query Language)是Hibernate框架中用于查询和操作持久化对象的查询语言。
下面是一些常见的HQL语句示例:1. 查询所有对象:SELECT obj FROM Object obj.2. 条件查询:SELECT obj FROM Object obj WHERE obj.property = value.3. 排序查询:SELECT obj FROM Object obj ORDER BY obj.propertyASC/DESC.4. 分页查询:SELECT obj FROM Object obj LIMIT start, size.5. 聚合函数查询:SELECT COUNT(obj) FROM Object obj.6. 连接查询:SELECT obj FROM Object obj JOIN obj.otherObject.7. 子查询:SELECT obj FROM Object obj WHERE obj.property IN (SELECT property FROM OtherObject)。
8. 更新数据:UPDATE Object obj SET obj.property = value WHERE condition.9. 删除数据:DELETE FROM Object obj WHERE condition.10. 嵌套查询:SELECT obj FROM Object obj WHERE obj.property IN (SELECT property FROM OtherObject WHERE condition)。
以上只是HQL语句的一小部分示例,实际使用中可以根据具体需求进行组合和扩展。
同时,需要根据具体的数据模型和数据库结构来编写相应的HQL语句。
hibernate hql连接查询语法
Hibernate HQL(Hibernate Query Language)是一种基于SQL 的查询语言,它提供了一种方便的方式来执行数据库查询,同时也可以避免一些SQL 注入等安全问题。
在Hibernate HQL 中,可以使用以下语法进行连接查询:1. 内连接查询(INNER JOIN):```sqlSELECT entity1, entity2FROM entity1INNER JOIN entity2 ON entity1.id = entity2.idWHERE conditions```上面的查询会返回所有`entity1` 和`entity2` 之间存在连接的记录,其中`entity1.id` 和`entity2.id` 相等。
2. 左连接查询(LEFT JOIN):```sqlSELECT entity1, entity2FROM entity1LEFT JOIN entity2 ON entity1.id = entity2.idWHERE conditions```上面的查询会返回所有`entity1` 的记录以及与之相连接的`entity2` 的记录,如果`entity2` 不存在,则返回`null` 值。
3. 右连接查询(RIGHT JOIN):```sqlSELECT entity1, entity2FROM entity2RIGHT JOIN entity1 ON entity1.id = entity2.idWHERE conditions```上面的查询会返回所有`entity2` 的记录以及与之相连接的`entity1` 的记录,如果`entity1` 不存在,则返回`null` 值。
在连接查询中,`entity1` 和`entity2` 表示要连接的两个实体类,`id` 是实体类中的主键属性,`conditions` 是查询条件。
如果需要指定连接的条件,可以在`JOIN` 关键字后面指定连接条件。
Hibernate笔记HQL查询(一)单属性,多属性查询
Hibernate笔记HQL查询(一)单属性,多属性查询HQL是Hiberante官方推荐的Hibernate检索方式,它使用类似SQL的查询语言,以面向对象的方式从数据库中查询。
可以使用HQL 查询具有继承、多态和关联关系的数据。
在检索数据时应优先考虑使用HQL方式。
本笔记将会沿用前面所使用的dept部门表,emp员工表。
dept部门表emp员工表1 查询实体hibernate的session.createQuery()方法是使用HQL语句查询对象的。
hql:是查询对象的,例如:"from User",其中from不区分大小写,而User是区分大小写,因为它是对象。
是User类返回Query对象。
执行这条语句后,Hibernate会根据配置文件中所配置的数据库适配器自动生成相应数据库的SQL语句。
sql: select * from dept; from 后面是表名hql: form Dept; from 后面是类。
可以对类起别名,有两种方法。
hql: from Dept dhql:from Dept as d以上两种起别名方法皆可。
public void Test1() throws Exception{Configuration config=new Configuration().configure();SessionFactory sessionFactory= config.buildSessionFactory();Session session=null;Transaction tr=null;try{session= sessionFactory.openSession();tr=session.beginTransaction();String hql="from Dept"; //定义String类型hql,写入hql语句。
Query query=session.createQuery(hql);List<Dept> list = query.list();for(Dept dept:list){System.out.print("部门编号: "+dept.getDid() +" ");System.out.println("部门名称: "+dept.getDname());}mit();}catch(Exception e){tr.rollback();}finally{if(session!=null){session.close();}if(sessionFactory!=null){sessionFactory.close();}}}执行结果Hibernate: select dept0_.did as did1_, dept0_.dname as dname1_, dept0_.daddress as daddress1_ from dept dept0_ 部门编号: 1 部门名称:业务部部门编号: 2 部门名称:技术部部门编号: 3 部门名称:管理部部门编号: 4 部门名称:财务部部门编号: 5 部门名称:人力资源部2 查询表中单个属性sql: select ename from depthql: select ename from Dept对属性也可以设置别名hql:select ename as from Deptas 必须加。
hql查询语句用法详解
hql查询语句用法详解HQL(Hive Query Language)是用于查询和操作Apache Hive数据仓库的查询语言。
HQL类似于SQL(Structured Query Language),但在某些方面有所不同。
下面是HQL查询语句的用法详解:1. 查询语法:SELECT [DISTINCT] column_listFROM table_name[WHERE condition][GROUP BY column_list][HAVING condition][ORDER BY column_list [ASC|DESC]][LIMIT n]●`SELECT`子句指定要从表中检索的列,可以使用`*`表示所有列,也可以指定特定的列。
●`DISTINCT`关键字可选,用于去除结果中的重复行。
●`FROM`子句指定要查询的表名。
●`WHERE`子句可选,用于指定查询的条件。
●`GROUP BY`子句可选,用于对结果进行分组。
●`HAVING`子句可选,用于指定对分组结果的条件。
●`ORDER BY`子句可选,用于对结果进行排序,默认为升序(ASC),也可以指定降序(DESC)。
●`LIMIT`子句可选,用于限制结果集的行数。
2. 过滤条件:在`WHERE`子句中,可以使用比较运算符(例如`=`, `<>`, `<`, `>`, `<=`, `>=`)进行条件过滤,也可以使用逻辑运算符(例如`AND`, `OR`, `NOT`)进行条件组合。
例如:SELECT * FROM employees WHERE salary > 5000 AND department = 'IT'3. 聚合函数:HQL支持常见的聚合函数,例如`COUNT`, `SUM`, `AVG`,`MIN`, `MAX`等。
这些函数通常与`GROUP BY`子句一起使用来对数据进行统计分析。
hql查询语法
hql查询语法HQL(Hibernate Query Language)是Hibernate框架中用于查询数据库的一种语言,它类似于SQL语言,但是更加面向对象化。
HQL 语言可以通过Hibernate框架将查询语句转换为SQL语句,然后执行查询操作。
HQL查询语法的基本结构如下:```SELECT [DISTINCT] select_expressionFROM from_clause[WHERE where_condition][GROUP BY grouping_expression][HAVING having_condition][ORDER BY ordering_expression [ASC | DESC]]```其中,SELECT子句用于指定查询的结果集,可以使用聚合函数、表达式、列名等作为查询结果;FROM子句用于指定查询的数据源,可以是一个表、一个视图、一个子查询等;WHERE子句用于指定查询的条件,可以使用比较运算符、逻辑运算符、IN、BETWEEN等操作符;GROUP BY子句用于对查询结果进行分组,可以使用聚合函数、列名等作为分组依据;HAVING子句用于对分组后的结果进行筛选;ORDER BY子句用于对查询结果进行排序,可以使用列名、表达式等作为排序依据。
HQL查询语法中还有一些其他的关键字和操作符,如DISTINCT、JOIN、LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN等,这些关键字和操作符可以用于更加复杂的查询操作。
下面是一个简单的HQL查询示例:```SELECT , e.salaryFROM Employee eWHERE e.department = 'IT'ORDER BY e.salary DESC```这个查询语句用于查询所有部门为IT的员工的姓名和薪水,并按照薪水从高到低排序。
总之,HQL查询语法是Hibernate框架中非常重要的一部分,掌握它可以帮助我们更加高效地进行数据库查询操作。
hql对数据库的查询语句
hql对数据库的查询语句标题:HQL查询语句示例1. 查询所有记录```hqlSELECT * FROM table_name;```2. 查询指定字段的记录```hqlSELECT column1, column2 FROM table_name; ```3. 查询满足条件的记录```hqlSELECT * FROM table_name WHERE condition; ```4. 使用聚合函数查询数据```hqlSELECT COUNT(*) FROM table_name; SELECT SUM(column) FROM table_name; SELECT AVG(column) FROM table_name; SELECT MAX(column) FROM table_name;SELECT MIN(column) FROM table_name;```5. 查询记录并按指定字段排序```hqlSELECT * FROM table_name ORDER BY column ASC/DESC; ```6. 查询记录并限制返回的行数```hqlSELECT * FROM table_name LIMIT count;```7. 查询记录并分页显示```hqlSELECT * FROM table_name LIMIT start, count;```8. 使用连接查询```hqlSELECT * FROM table1 INNER JOIN table2 ON condition; SELECT * FROM table1 LEFT JOIN table2 ON condition; SELECT * FROM table1 RIGHT JOIN table2 ON condition; ```9. 使用子查询查询数据```hqlSELECT column FROM table_name WHERE column IN (SELECT column FROM table_name WHERE condition);SELECT column FROM (SELECT column FROM table_name WHERE condition) AS subquery;```10. 使用通配符进行模糊查询```hqlSELECT * FROM table_name WHERE column LIKE pattern;```11. 使用GROUP BY进行分组查询```hqlSELECT column, COUNT(*) FROM table_name GROUP BY column;```12. 使用HAVING进行分组条件过滤```hqlSELECT column, COUNT(*) FROM table_name GROUP BY column HAVING condition;```13. 使用DISTINCT查询去重记录```hqlSELECT DISTINCT column FROM table_name;```14. 使用CASE WHEN进行条件查询```hqlSELECT column, CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE result3 END FROM table_name; ```15. 使用BETWEEN进行范围查询```hqlSELECT * FROM table_name WHERE column BETWEEN value1 AND value2;```16. 使用EXISTS进行关联查询```hqlSELECT column FROM table1 WHERE EXISTS (SELECT column FROM table2 WHERE condition);```17. 使用UNION合并查询结果```hqlSELECT column FROM table1 UNION SELECT column FROM table2;```18. 使用ORDER BY和LIMIT实现分页查询```hqlSELECT column FROM table_name ORDER BY column LIMIT start, count;```19. 使用JOIN和子查询实现复杂的数据查询```hqlSELECT * FROM table1 JOIN (SELECT column FROM table2 WHERE condition) AS subquery ON condition;```20. 使用GROUP BY和HAVING实现分组统计查询```hqlSELECT column1, COUNT(*) FROM table_name GROUP BY column1 HAVING COUNT(*) > 10;```总结:本文列举了20个基于HQL的数据库查询语句示例,包括查询所有记录、指定字段的记录、满足条件的记录、使用聚合函数查询数据、按指定字段排序、限制返回的行数、分页显示、连接查询、子查询、模糊查询、分组查询、分组条件过滤、去重记录、条件查询、范围查询、关联查询、合并查询结果、分页查询以及复杂的数据查询和统计查询等多种查询场景。
hql查询语句
.1.from子句from Person表明从Person持久化类中选出全部的实例。
推荐:from Person as p2.select子句select from Person as pselect .firstName from Person as pselect new list(, p.address) from Person as pselect new ClassTest(, p.address) from Person as p (有前提)select as personName from Person as pselect new map( as personName) from Person as p (与new map()结合更普遍) 3.统计函数查询:1: count() 统计记录的条数2: min() 求最小值3: max() 求最大值4: sum() 求和4: avg() 求平均值//取得Student的数量Query query=session.createQuery("select count(*) from Student")//avg()取得Student平均年龄Query query=session.createQuery("select avg(s.age) from Student as s")//upper()方法将字符串转为大写Query query=session.createQuery("select upper() from Student as s")//去除重复行distinctQuery query=session.createQuery("select distinct s.age from Student as s") select count(*) from Personselect max(p.age) from Person as pselect || "" || p.address from Person as p4.多态查询from Person as pfrom ng.Object ofrom Named as n5.where子句from Person where name like "tom%"from Person as p where like "tom%"from Cat cat where like "kit%"select * from cat_table as table1 cat_table as table2 where table1.mate = table2.id and like "kit%"from Foo foo where foo.bar.baz.customer.address.city like "fuzhou%" from Cat cat, Cat rival where cat.mate = rival.mateselect cat, matefrom Cat cat, Cat matewhere cat.mate = matefrom Cat as cat where cat.id = 123from Cat as cat where cat.mate.id = 69from Person as personwhere person.id.country = 'AU'and person.id.medicareNumber = 123456from Account as accountwhere account.owner.id.country = 'AU'and account.owner.id.medicareNumber = 123456from Cat cat where cat.class = DomesticCatfrom Account as a where .firstName like "dd%" // 正确from Account as a where like "dd%" // 错误6.表达式=, <>, >, <, >=, <=, between, not between, in, not in, is, like等。
第三章HQL查询
HQL基本应用
• From语句的使用
– HQL : from Student – From为HQL关键字,不区分大小写 – 注意的是Student不是表名,而是类名
where子句
//省略代码 String hql ="from Street as s where ='中关村大街'"; Query query = session.createQuery(hql); List userList = query.list(); //省略代码
– HQL:update Student set age = 20,name=‘李四’ where id = 20 – 执行更新操作调用Query接口的executeUpdate()方法 – 然后提交事务
HQL进阶应用
• 以下介绍HQL的高级应用
– HQL连接查询 – HQL命名查询(绑定参数) – HQL配置文件中定义查询语句
• Hibernate通用的分页实现 • 命名参数 • 返回可滚动的结果集等
String hql = “from Student”;//注意Student为类名不是表名 Query query = session.createQuery(hql); List list = query.list();
属性查询
• 查询实体对象的某个属性(数据库表中的某个字段信息 ) • 获取实体的多个属性
String hql ="select u.password from User as u where ='admin'";
hql ="select u.id,u.password from User as u where ='admin'"; •String 获取属性类型
hibernate HQL查询
hibernate HQL查询1. 查询表中的所有记录:from Category2. 带有where子句的条件查询:from Category c where > 'c5'3. 结果根据某一字段排序:from Category c order by desc(desc表示降序排列,asc表示升序排列)4. 去除重复记录获得单一记录:select distinct c from Category c order by desc5. 带有参数的查询:from Category c where c.id > :min and c.id < :max。
hql语句中’:min’表示的是参数,可以像jdbc中一样,为参数赋值。
在hql中可以这样,这里也运用了链式编程:session.createQuery("from Category c where c.id > :min and c.id < :max").setInteger("min", 2).setInteger("max", 8);6. 带参数hql查询的另外一种查询:from Category c where c.id > ? and c.id < ?7. hibernate分页查询Query q = session.createQuery("from Category c order by desc");q.setMaxResults(3);q.setFirstResult(0);其中setMaxResult()是设置每页的最大显示量,setFirstResult()是设置其实元素从哪里开始,这里0代表最后一条元素。
8. 多表连接查询:selectt.title, from Topic t join t.category c9. HQL函数:a) Count():select count(*) from Msg mb) Max()-min()-avg():select max(m.id), min(m.id), avg(m.id), sum(m.id) from Msg mc) Between:fromMsg m where m.id between 3 and 5d) In:fromMsg m where m.id in (3, 4, 5)10. Is null;is not null:fromMsg m where m.cont is not null11. Is empty:from Topic t where t.msgs is empty12. Like:from Topic t where t.title like '%5'。
使用hql进行查询修改和删除
1、实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql=”from User user ”;List list=session.CreateQuery(hql).list();上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User 实体对象,并且放入List中返回。
这里需要注意的是,Hibernate的实体查询存在着对继承关系的判定,比如我们前面讨论映射实体继承关系中的Employee实体对象,它有两个子类分别是HourlyEmployee,SalariedEmployee,如果有这样的HQL语句:“from Employee”,当执行检索时Hibernate会检索出所有Employee类型实体对象所对应的数据(包括它的子类HourlyEmployee,SalariedEmployee对应的数据)。
因为HQL语句与标准SQL语句相似,所以我们也可以在HQL语句中使用where字句,并且可以在where字句中使用各种表达式,比较操作符以及使用“and”,”or”连接不同的查询条件的组合。
看下面的一些简单的例子:from User user where user.age=20;from User user where user.age between 20 and 30;from User user where user.age in(20,30);from User user where is null;from User user where like …%zx%‟;from User user where (user.age%2)=1;from User user where user.age=20 and like …%zx%‟;2、实体的更新和删除:在继续讲解HQL其他更为强大的查询功能前,我们先来讲解以下利用HQL进行实体更新和删除的技术。
4.HQL查询语言
from User where name = ?
!
下标从0开始
按参数名称绑定
!
from User where name = :name 可读性好,易维护,
推荐使用
演示示例2:绑定参数
11/31
为参数赋值
setXXX():针对具体数据类型
setXXX( int position, XXX value) setXXX( String name, XXX value)
5/31
什么是HQL
示例 HQL是Hibernate查询语言(Hibernate Query Language)
from cn.hibernatdemo.entity.Dept from Dept from Dept where deptName = 'SALES' from Dept dept where dept.location is not null from Emp order by hireDate, salary desc select deptNo, deptName from Dept
创建Query对象 session执= se行ssi查onF询act,ory得.get到Cur查ren询tSe结ssio果n();
String hql = "from Emp"; Query query = session.createQuery( hql ); Iterator<Emp> empIterator = query.iterate();
共性问题集中讲解 常见问题及解决办法 代码规范问题 调试技巧
共性问题集中讲解
10/31
在HQL查询语句中绑定参数
第四章-HQL连接查询与缓存
4.1 HQL连接查询
(2)测试运行,结果如下。
从控制台输出可以发现,它发出的正是两表连接查询的SQL语句,list集合中的每一 个元素都是一个Object数组,其中数组的第一个元素(Object[0])是Classes对象,第 二个元素Object[1]是Student对象。可见,内连接查出来的是两个对象,子对象并 没有填充进父对象的集合属性中。
7
4.1 HQL连接查询
(2)运行,控制台输出如下。
可见Hibernate发出的SQL语句是多表连接查 询。该HQL查询语句并没用到inner join而是 以对象属性导航的形式引入关联对象,这就是 隐式内连接。对象属性导航也可用在select子 句中,如下所示。
8
4.1 H会向数据库提交事务。
> 直接调用Session的flush()方法。
> 当执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,会先刷出
缓存,以保证查询结果能够反映持久化对象的最新状态。
24
4.4一级缓存
一级缓存无须干预,只需了解其原理即可。下面通过具体案例证明Session一级缓存的存在。 在项目ssh41新建CacheTest.java类,添加一个test1()方法,代码如下所示。
4.3 HQL操作集合的函数或属性 4.4一级缓存 4.5 二级缓存 4.6 上机实验
12
4.2 HQL子查询
HQL子查询是指在当前查询查询语句(父查询)中使用()号嵌套了独立功能的子查询 语句,()号里面的子查询会返回一条或多条记录供父查询使用。如果子查询返回的是 一条记录,则使用=、>、<等跟父查询连接。如果返回多条记录,则通常使用下列关 键词进行连接。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Hibernate提供了强大的查询系统,使用Hibernate有多种查询方法可以选择:可以使用Hibernate的HQL查询,也可以使用条件查询,甚至可以使用原生的SQL 查询语句。
其中HQL查询时Hibernate配置的功能强大的查询语句。
HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的概念。
一、HQL查询HQL的语法和SQL很相似,但是HQL是一种面向对象的查询语句,它的操作对象是类、实例、属性等,而SQL的操作对象是数据表、列等数据库对象。
由于HQL是完全面向对象的查询语句,因此可以支持继承、多态等特性。
HQL查询依赖于Query类,每一个Query实例对应一个查询对象,它的执行是通过Session的createQuery()方法来获得的。
执行HQL查询的步骤:1、获得Hibernate Session对象2、编写HQL语句3、调用Session的createQuery方法创建查询对象4、如果HQL语句包含参数,则调用Query的setXxx方法为参数赋值5、调用Query对象的list等方法返回查询结果。
实例:上面的程序先编写HQL语句后,使用Session的createQuery(hql)方法创建一个Query,Query对象使用setXxx方法为HQL语句的参数赋值,最后调用list()方法返回查询的全部结果。
在这里Query对象可以连续多次调用setXxx方法为HQL参数赋值。
这是因为Hibernate Query的setXxx方法的返回值为Query本身,因此程序创建Query后,可以直接多次调用setXxx方法为HQL语句的参数赋值。
Query对象还包含如下两个方法:setFirstResult(int firstResult):设置返回的结果集从第几条记录开始setMaxResult(int maxResult):设置本次查询返回的结果数目这两个方法用于对HQL查询实现分页控制二、HQL查询的from子句Hibernate中最简单的查询语句的形式如下:Hibernate中最简单的查询语句的形式如下:From关键字后面紧跟持久化类的类名。
大多数情况下, 你需要指定一个别名, 原因是你可能需要在查询语句的其它部分引用到Person子句中可以同时出现多个类, 其查询结果是产生一个笛卡儿积或产生跨表的连接三、关联与连接当程序需要从多个数据表中获取数据时,Hibernate使用关联映射来处理底层数据表之间的连接,一旦我们提供了正确的关联映射后,当程序通过Hibernate 进行持久化访问时,将可利用Hibernate的关联来进行连接。
HQL支持两种关联join的形式:implicit(隐式)与explicit(显式)。
显式form子句中明确给出了join关键字,而隐式使用英文点号(.)来连接关联实体。
受支持的连接类型是从ANSI SQL中借鉴来的。
inner join(内连接)left outer join(左外连接)right outer join(右外连接)full join (全连接,并不常用)使用显式连接,可以通过with关键字来提供额外的join条件从上面可以看出with关键字的作用等同于SQL中on关键字的作用:用于指定连接条件。
还有,一个"fetch"连接允许仅仅使用一个选择语句就将相关联的对象或一组值的集合随着他们的父对象的初始化而被初始化,这种方法在使用到集合的情况下尤其有用,对于关联和集合来说,它有效的代替了映射文件中的外联接与延迟声明(lazy declarations)。
对于隐式连接和显示连接有如下两个区别:1、显式连接底层将转换成SQL99的交叉连接,显式连接底层将转换成SQL99的inner join、left join、right join等连接。
2、隐式连接和显式连接查询后返回的结果不同。
使用隐式连接查询返回的结果是多个被查询实体组成的集合。
使用显式连接的结果分为两种:如果HQL 语句中省略select关键字时,返回的结果也是集合,但集合元素是被查询持久化对象、所有被关联的持久化对象所组成的数组。
如果没有省略select关键字,返回的结果同样是集合,集合中的元素是跟在select关键字后的持久化对象组成的数组。
........1中返回的结构是有Person实体和MyEvent实体组成的数组集合。
而.........2 返回的结果是只有Person组成的集合。
对于有集合属性的。
Hibernate默认采用延迟加载策略。
如对于持久化类Person,有集合属性myEvent。
加载Person实例时,默认是不加载myEvent的,如果session被关闭了,Person实例将会无法访问到关联的myEvent属性的。
为了解决这个问题,可以再Hibernate映射文件中配置指定:lazy="false"来关闭延迟加载。
或者使用join fetch:一个fetch连接通常不需要被指定别名, 因为相关联的对象不应当被用在where 子句(或其它任何子句)中。
同时,相关联的对象并不在查询的结果中直接返回,但可以通过他们的父对象来访问到他们。
使用fetch关键字时需要注意以下几个问题:1、fetch不应该与setMaxResults()和setFirstResults()共用,2、fetch不能与独立的with条件一起使用3、如果在一次查询中fetch多个集合,可以查询返回的笛卡尔积4、full join fetch和right join fetch没有任何意义5、对于bag映射而言,同时join fetch多个结合时可能会出现非预期结果四、select子句Select子句用于选择将哪些对象与属性返回到查询结果集中。
当然select 选择的属性必须是from后持久化类包含的属性。
select查询语句可以返回值为任何类型的属性,包括返回类型为某种组件(Component)的属性:select查询语句可以返回多个对象和(或)属性,存放在Object[]队列中:Select查询语句也支持将选择出的属性存放到一个List对象中Select查询语句还可以将选择出的属性直接封装成一个对象。
但前提是ClassTest支持p.id,,p.age的构造前,假如p.id的数据类型是int, 的数据类型是String,p.age的数据类型是int,那么ClassTest必须有如下构造器:Select还支持给选定的表达式名别名:种做法在与子句select new map一起使用时最有用:五、聚集函数受支持的聚集函数如下:avg(...), sum(...), min(...), max(...)count(*)count(...), count(distinct ...), count(all...)Select子句也支持使用distinct和all关键字,此时的效果与SQL中的效果相同。
六、多态查询Hibernate可以理解多态查询,from后跟持久化类名,不仅会查出该持久化类的全部实例还好查询出该类的全部子类的全部实例。
该查询语句不仅会查询出Person的全部实例,还会查询出Person的子类:Teacher的全部属性。
Hibernate 可以在from子句中指定任何 Java 类或接口. 查询会返回继承了该类的所有持久化子类的实例或返回声明了该接口的所有持久化类的实例。
下面的查询语句返回所有的被持久化的对象:七、Where子句where子句允许你将返回的实例列表的范围缩小. 如果没有指定别名,你可以使用属性名来直接引用属性:如果指派了别名,需要使用完整的属性名:复合属性表达式增强了where子句的功能:该查询语句被翻译为一个含有内连接的SQL查询语句。
只要没有出现集合属性,HQL语句可使用点号来隐式连接多个数据表:特殊属性(小写)id可以用来表示一个对象的唯一的标识符第二个查询是有效的。
此时不需要进行表连接,而完全使用面向对象的方式查询!在进行多态持久化的情况下,class关键字用来存取一个实例的鉴别之。
嵌入where自己中的java类名将会被作为该类的鉴别值。
在执行多态的时候,默认会选出Person及其所有子类的实例,但是上面的HQL语句,将只会选出Teacher类的实例。
当where子句的运算符只支持基本类型或者字符串时,where子句中的属性表达式必须以基本类型或者字符串结尾,不要使用组件类型属性结尾。
八、order by 子句查询返回的列表(list)可以按照一个返回的类或组件(components)中的任何属性(property)进行排序:可选的asc或desc关键字指明了按照升序或降序进行排序.九、group by子句一个返回聚集值(aggregate values)的查询可以按照一个返回的类或组件(components)中的任何属性(property)进行分组:可以使用having子句对分组进行过滤注意:group by子句与 order by子句中都不能包含算术表达式。
也要注意Hibernate目前不会扩展group的实体,因此你不能写group by cat,除非cat的所有属性都不是聚集的。
你必须明确的列出所有的非聚集属性。
注意:group by子句与 order by子句中都不能包含算术表达式。
也要注意Hibernate目前不会扩展group的实体,因此你不能写group by cat,除非cat的所有属性都不是聚集的。
你必须明确的列出所有的非聚集属性。
与SQL子查询相同,如果子查询是多行结果集,则应该使用多行运算符。
同时HQL子查询只可以在select子句或者where子句中出现。
如果在select子查询或的列表中包含多项,则在HQL中需要使用一个元组构造符:十一、命名查询HQL查询还支持将查询所用的HQL语句放在配置文件中,而不是程序代码中。
通过这种方式,可以大大提高程序的解耦。
在Hibernate映射文件中使用<query.../>元素来定义命名查询。
使用<query.../>元素是需要指定一个name属性,该属性指定该命名查询的名字。
Session提供一个getNamedQuery(String name)方法用于获取指定命名HQL查询并且创建Query对象。