查询:
Hibernate支持三种查询方式
(1)hql
(2)条件查询Criteria,Query
(3)原始sql
hql查询
它全称Hibernate Qusery Language, HQL是面向对象的(OO)的. HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。
注意:大小写敏感。
(1) from子句
i. 查询所有
1. session.createQuery("from Person");
ii. 查询单条数据
1. 有两种方式取值:
2. 先得到一个Query对象实例
a) query.uniqueResult()
b) query.list().get(0)
3. 查询具体表中某些字段数据
a) session.createQuery("select name,age from Person");
4. 它返回的List 集合,元素是数组对象。
(2) 关联(Association)与连接(Join)
inner join(内连接),可以简写为join
left outer join(左外连接) ,可以简写为left join
right outer join(右外连接) , 可以简写为right join
full join (全连接,并不常用)
(3) 聚集函数
HQL查询甚至可以返回作用于属性之上的聚集函数的计算结果:
select avg(Person.weight), sum(Person.weight), max(Person.weight), count(Person) from Person person
(4) 多态查询
一个如下的查询语句:
from Person person
不仅返回Person类的实例, 也同时返回它子类的实例. Hibernate 可以在from子句中指定任何 Java 类或接口. 查询会返回继承了该类的所有持久化子类 的实例或返回声明了该接口的所有持久化类的实例。
(5) where子句
where子句允许你将返回的实例列表的范围缩小. 如果没有指定别名,你可以使用属性名来直接引用属性:
(6) 表达式
在where子句中允许使用的表达式包括 大多数你可以在SQL使用的表达式种类:
(7) order by子句
查询返回的列表(list)可以按照一个返回的类或组件(components)中的任何属性(property)进行排序:
可选的asc或desc关键字指明了按照升序或降序进行排序.
(8) group by子句
一个返回聚集值(aggregate values)的查询可以按照一个返回的类或组件(components)中的任何属性(property)进行分组:having子句在这里也允许使用.
(9) 子查询
对于支持子查询的数据库,Hibernate支持在查询中使用子查询。一个子查询必须被圆括号包围起来(经常是SQL聚集函数的圆括号)。 甚至相互关联的子查询(引用到外部查询中的别名的子查询)也是允许的。
Criteria(QBC中C指的就是Criteria)
它是一个接口,它的使用比hql要容易的多。Criteria接口与DetachedCriteria。
离线操作:就是当请求和数据库断开连接的时候,DetachedCriteria也可以操作。它不需要借助Session来创建,而是直接用。
离线操作:即便是数据库连接中断也能进行数据操作。
(二者的区别就是DetachedCriteria可以离线操作,而Criteria不可以)
带条件查询:用到Restrictions 对象,该对象用于添加约束。Person为一个POJO类。
模板查询(QBE,E就是指Example)
也是一种查询方式,比较常用,是允许通过给对象设值来查询。
例子:
使用聚集函数:用到 Projections这个投影类,里面包含了对聚集函数操作,返回的结果可用uniqueResult() 取得.
结果集排序:Order对象来操作,里面包含了升序,降序的方法。
原始的SQL
使用SQL查询可以利用某些数据库的特性,或者用于将原有的JDBC应用迁移到Hibernate应用上。使用命名的SQL查询还可以将SQL语句放在配置文件中配置,从而提高程序的解耦,命名SQL查询还可以用于调用存储过程。
对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。
命名SQL查询
可以将SQL语句不放在程序中,而放在配置文件中,这种方式以松耦合的方式配置SQL语句,可从而降低耦合。
在Hibernate的映射文件中定义查询名,然后确定查询所用的SQL语句,然后就可以直接调用该命名SQL查询。在这种情况下,不需要调用addEntity()方法,因为在配置命名SQL查询时,已经完成了查询结果与实体的关联。
在配置文件里配置
调用
Hibernate 3引入了对存储过程查询(stored procedure)和函数(function)的支持.以下的说明中,这二者一般都适用。 存储过程/函数必须返回一个结果集,作为Hibernate能够使用的第一个外部参数. 下面是一个Oracle9和更高版本的存储过程例子.
创建一个存储过程
配置
使用Query接口或Criteria接口实现分页
● setFirstResult(),设置返回结果集的起始点。
● setMaxResults(),设置查询获取的最大记录数。