目录
Hibernate连接查询
HQL的连接查询
HQL支持的常用连接类型
用于有关联关系的持久化类,并且在映射文件中对这种关联关系做了映射
连接类型 | HQL语法 |
---|---|
内连接 | inner join 或 join |
迫切内连接 | inner join fetch 或 join fetch |
左外连接 | left outer join 或 left join |
迫切左外连接 | left outer join fetch 或 left outer fetch |
右外连接 | right outer join 或 right join |
HQL最后执行的是SQL语句,只是将HQL语句转为了SQL语句然后在数据库中运行
HQL语句是基于关联关系的。查询出来的每行都是一个对象数组
1.内连接
语法:
from Entity [inner] join [fetch] Entity.property
例如:
String hql = “from Dept d ”;
2.外连接
(1)左外连接
语法:
from Entity left [outer] join [fetch] Entity.property
// 例:
// d.emps为Dept中的集合属性(关联属性)
String hql = “from Dept d left outer join d.emps”;
// 上面等同于SQL:
select * from Dept d left join Emp e on d.deptno=e.deptno
(2)右外连接
语法:
from Entity right [outer] join Entity.property
// 例:
String hql = “from Emp e right outer join e.dept”;
3.等值连接
等值连接适用于两个类之间没有定义任何关联时
语法:
from Dept d,Emp e where d=e.dept
使用等值连接时应避免from Dept,Emp这样的语句出现。
4.隐式内连接
在HQL语句中,对Emp类可以通过dept.deptName的形式访问器关联的dept对象的deptName属性。使用隐式内连接按部门条件查询员工信息。
例:from Emp e where e.dept.deptName=?
迫切左(内)外连接
语法:
from Entity left join fetch Entity.property
// 例:
String hql = “from Emp e left outer join e.dept”;
在查询完成之后,建立关联,将关联属性初始化,只要拿到左边的也就拿到了右边的;而无迫切查询到的结果返回的是一个Object的数组,需要手动获取
连接与迫切连接的主要区别是在于关联属性是否被初始化
返回值:一个是对象数组,一个是左(内)类型
分组统计数据
使用having关键字对分组数据设定约束条件,从而完成对数据分组的统计
语法:
[select …] from … [where…] [group by…] [having…] [order by…]
聚合函数
(1)count() 统计记录条数
(2)sum() 求和
(3)min() 求最小值
(4)max() 求最大值
(5)avg() 求平均值
在查询的时候选区多个对象,所以list()、uniqueResult()等,返回的是一个数组Object[]
子查询
子查询应用在HQL语句的where子句中,子查询语句需放在()里面
子查询关键字
关键字 | 说明 |
---|---|
all | 子查询语句返回的所有记录 |
any | 子查询语句返回的任意一条记录 |
some | 与“any”意思相同 |
in | 与“=any”意思相同 |
exists | 子查询语句至少返回一条记录 |
操作集合的函数或属性
函数或属性 | 说明 |
---|---|
size()或size | 获取集合中元素的数目 |
minIndex()或minIndex | 对于建立了索引的集合,获得最小的索引 |
maxIndex()或maxIndex | 对于建立了索引的集合,获得最大的索引 |
minElement()或minElement | 对于包含基本类型元素的集合,获得集合中取值最小的元素 |
maxElement()或maxElement | 对于包含基本类型元素的集合,获得集合中取值最大的元素 |
elements() | 获取集合中的所有元素 |
查询性能优化
1.Hibernate查询优化策略
(1)使用迫切左外连接或迫切内连接查询策略、配置二级缓冲和查询缓冲等方式,减少select语句的数目,降低访问数据库的频率
2.HQL优化
HQL优化是Hibernate程序性能优化的一个方面,HQL的语法与SQL非常相似。HQL是基于SQL的,只是增加了面向对象的封装。
如果抛开HQL同Hibernate本身一些缓冲机制的关联,HQL的优化技巧同SQL的优化技巧一样。
在编写HQL,需要注意
(1)避免or操作的使用不当。如果where子句中有多个文件,并且其中某个条件没有索引,使用or,将导致全表扫描
(2)避免使用not。如果where子句的条件包含not关键字,那么只需时该字段的索引失效。对于不大于(不多于)、不小于(不少于)的条件,建议使用比较运算符来代替not,如不大于就是小于等于
(3)避免like的特殊形式。某些情况下,会在where子句条件中使用like。如果以一个“%”或“_”开始即前模糊,则该字段的索引不起作用。但是非常遗憾的是,对于这种问题并没有较好的解决方法,只能通过改变索引字段的形式变相地解决
(4)避免having子句。在分组的查询语句中,可在两个位置指定条件,一是在where子句中,二是在having子句中。要尽可能地在where子句中而不是having子句中指定条件。Having是在检索出所有记录之后才对结果集进行过滤,这个处理需要一定的开销,而where子句限制记录数目,能减少这方面的开销
(5)避免使用distinct。执行distinct会导致在结果集中删除重复的行,这会对处理时间造成一定的影响,因此在不要求或允许冗于时,应避免使用distinct
(6)索引在以下情况下失效,使用时应注意
①对字段使用函数,该字段的索引将不起作用,如substring(aa,1,2)= ‘xx’
②对字段进行计算,该字段的索引将不起作用,如price+10