hibernate hql

hibernate get和load的区别
get不支持lazy,load支持lazy
采用get加载数据,如果没有匹配的数据,返回null,而load则抛出异常

hibernate中三种状态特征

transient
在数据库中没有与之匹配的数据,没有纳入session的管理

persistent
persistent状态的对象在数据库中有与之匹配的数据,纳入了session的管理,在清理缓存(脏数据检查)的时候,会和数据库同步

detached
在数据库中有与之匹配的数据,没有纳入session的管理

session flush方法主要做了两件事:清理缓存,执行sql
flush方法默认在事务提交时,显示的调用flush,在执行查询前,如:iterate

hibernate按照save(insert),update,delete顺序提交相关操作

N + 1问题,在默认情况下,使用query.iterate查询,有可以能出现N+1问题
所谓的N+1是在查询的时候发出了N+1条sql语句
1: 首先发出一条查询对象id列表的sql
N: 根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句
list和iterate的区别?
list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据
iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能出现N+1问题

条件查询
可以采用 ?来传递参数(索引从0开始)
可以采用 :参数名 来传递参数,如果传递多个参数,可以采用setParamterList方法

外置命名查询
在映射文件中采用<query>标签来定义hql
在程序中采用session.getNamedQuery()方法得到hql查询串

分页查询
setFirstResult(),从0开始
setMaxResults,每页显示多少条数据

hibernate查询缓存
查询缓存是针对普通属性结果集的缓存
对实体对象的结果集只缓存id

查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束
查询缓存的配置和使用:
* 在hibernate.cfg.xml文件中启用查询缓存,如:
<property name="hibernate.cache.use_query_cache">true</property>
* 在程序中必须手动启用查询缓存,如:
query.setCacheable(true);


Hql语言的特点:
1.hql语言是不区分大小写的,但对于对象和属性的名称,则必须区分大小写

2.hql是面向对象的查询方式,他是对持久化对象实体进行操作,从而实现对数据库的操作。

3.hql进行实体查询时,HQL语句可以省略select子句。

4.hql在执行查询或是删除、更新操作时,要实体对象和数据库中表名不同,一定要与实体对象名称一致,包括大小写。

5.from子句
Hibernate中最简单的查询语句的形式如下:from eg.Cat 该子句简单的返回eg.Cat类的所有实例。
通常我们不需要使用类的全限定名, 因为 auto-import(自动引入) 是缺省的情况。
所以我们几乎只使用如下的简单写法:from Cat

可以使用别名from Cat as cat
关键字as 是可选的,我们也可以这样写:from Cat cat

子句中可以同时出现多个类, 其查询结果是产生一个笛卡儿积或产生跨表的连接。
from Formula, Parameter
from Formula as form, Parameter as param

6.关联(Association)与连接Join
我们也可以为相关联的实体甚至是对一个集合中的全部元素指定一个别名, 这时要使用关键字join。
from Cat as cat
inner join cat.mate as mate
left outer join cat.kittens as kitten
from Cat as cat left join cat.mate.kittens as kittens
from Formula form full join form.parameter param

from Cat as cat
join cat.mate as mate
left join cat.kittens as kitten

inner join(内连接) 简写join
left outer join(左外连接) 简写left join
right outer join(右外连接) 简写right join
full join (全连接,并不常用)

通过HQL的with关键字,你可以提供额外的join条件。
from Cat as cat
left join cat.kittens as kitten
with kitten.bodyWeight > 10.0

一个"fetch"连接允许仅仅使用一个选择语句就将相关联的对象或一组值的集合随着他们的父对象的初始化而被初始化,这种方法在使用到集合的情况下尤其有用,对于关联和集合来说,它有效的代替了映射文件中的外联接 与延迟声明
from Cat as cat
inner join fetch cat.mate
left join fetch cat.kittens
一个fetch连接通常不需要被指定别名, 因为相关联的对象不应当被用在 where 子句 (或其它任何子句)中。
同时,相关联的对象 并不在查询的结果中直接返回,但可以通过他们的父对象来访问到他们。
from Cat as cat
inner join fetch cat.mate
left join fetch cat.kittens child
left join fetch child.kittens
假若使用iterate()来调用查询,请注意fetch构造是不能使用的(scroll()可以使用)。
fetch也不应该与setMaxResults()或setFirstResult()共用,这是因为这些操作是基于结果集的,而在预先抓取集合类时可能包含重复的数据,也就是说无法预先知道精确的行数。fetch还不能与独立的 with条件一起使用。通过在一次查询中fetch多个集合,可以制造出笛卡尔积,因此请多加注意。对bag映射来说,同时join fetch多个集合角色可能在某些情况下给出并非预期的结果,也请小心。最后注意,使用full join fetch 与 right join fetch是没有意义的。
from Document doc fetch all properties where lower(doc.name) like '%cats%'

7.join 语法的形式
HQL支持两种关联join的形式:implicit(隐式) 与explicit(显式)。
用from子句中明确给出了join关键字。这是建议使用的方式。
implicit(隐式)形式不使用join关键字。关联使用"点号"来进行"引用"。
implicit join可以在任何HQL子句中出现.implicit join在最终的SQL语句中以inner join的方式出现。
from Cat as cat where cat.mate.name like '%s%'

8.select子句
select 子句选择将哪些对象与属性返 回到查询结果集中. 考虑如下情况:
select mate from Cat as cat inner join cat.mate as mate
该语句将选择mates of other Cats。实际上, 你可以更简洁的用以下的查询语句表达相同的含义:
select cat.mate from Cat cat

查询语句可以返回值为任何类型的属性,包括返回类型为某种组件(Component)的属性:
select cat.name from DomesticCat cat where cat.name like 'fri%'
select cust.name.firstName from Customer as cust

查询语句可以返回多个对象和(或)属性,存放在 Object[]队列中,
select mother, offspr, mate.name
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr
或存放在一个List对象中
select new list(mother, offspr, mate.name)
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr

也可能直接返回一个实际的类型安全的Java对象,需要提供相应的构造方法
select new Family(mother, mate, offspr)
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr

你可以使用关键字as给"被选择了的表达式"指派别名:
select max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n from Cat cat
这种做法在与子句select new map一起使用时最有用:
select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n ) from Cat cat
该查询返回了一个Map的对象,内容是别名与被选择的值组成的名-值映射。

8.聚集函数
HQL查询甚至可以返回作用于属性之上的聚集函数的计算结果:
select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat)
from Cat cat
受支持的聚集函数如下:
avg(...), sum(...), min(...), max(...)
count(*)
count(...), count(distinct ...), count(all...)
你可以在选择子句中使用数学操作符、连接以及经过验证的SQL函数:

关键字distinct与all 也可以使用,它们具有与SQL相同的语义.
select distinct cat.name from Cat cat
select count(distinct cat.name), count(cat) from Cat cat

9.多态查询
一个如下的查询语句:
from Cat as cat
不仅返回Cat类的实例, 也同时返回子类 DomesticCat的实例. Hibernate 可以在from子句中指定任何 Java 类或接口. 查询会返回继承了该类的所有持久化子类 的实例或返回声明了该接口的所有持久化类的实例。下面的查询语句返回所有的被持久化的对象:from java.lang.Object o

10where子句
where子句允许你将返回的实例列表的范围缩小. 如果没有指定别名,你可以使用属性名来直接引用属性:
from Cat where name='Fritz'
如果指派了别名,需要使用完整的属性名:
from Cat as cat where cat.name='Fritz'

select foo
from Foo foo, Bar bar
where foo.startDate = bar.date

将返回所有满足下面条件的Foo类的实例: 存在如下的bar的一个实例,其date属性等于 Foo的startDate属性。 复合路径表达式使得where子句非常的强大,考虑如下情况:

from Cat cat where cat.mate.name is not null
该查询将被翻译成为一个含有表连接(内连接)的SQL查询。如果你打算写像这样的查询语句
from Foo foo
where foo.bar.baz.customer.address.city is not null

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值