7.Hibernate连接查询

文章详细介绍了Hibernate中的HQL连接查询,包括内连接、外连接(左外、右外)、等值连接和隐式内连接。此外,还讨论了迫切连接、分组统计、聚合函数、子查询以及集合操作。最后,文章提到了Hibernate查询的性能优化策略,如使用迫切连接、避免特定操作以提高查询效率。
摘要由CSDN通过智能技术生成

目录


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未禾

您的支持是我最宝贵的财富!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值