Hibernate查询的API和优化(Lazy、fetch)

 

5种检索方式:

oid检索:get和load 

 对象导航检索:从A的属性(B的引用)中获取B

sql检索:

hql检索: 面向对象 获取: session.createQuery(hql语句); 

基本查询 

排序查询 :order by

条件查询 

方式1:按位置设置参数 

扩展方式:按名称设置参数 

hql语句中的参数 使用 :名称 

设置参数: setParameter(参数名称,值); 

分页查询 :setFirstResult();

统计查询: Query query = session.createQuery("selectcount(*) from xxx  group by xxx");

投影查询(查询部分属性) Query query = session.createQuery("select x,xx from xxx");

将部分属性封装到对象中 

1.需要在持久化中提供相应的构造器 

2.hql:select new 类(属性1,属性2) Query query = session.createQuery("select new Customer(x,,xx) from xx"); 

 

qbc检索: 获取对象: session.createCriteria(Class class); 

基本查询 

排序查询 addOrder(Order.asc|desc("属性名称")); 

条件查询 add(Restrictions.like|eq(...)); 

分页查询 

统计查询 setProjection(Projections.avg|sum|count|max|min(属性名)); setProjection(Projections.rowCount()); 

离线查询 能够脱离session使用. 

条件查询的使用 

在web层获取一个离线对象 

DetachedCriteria dc = DetachedCriteria.forClass(Class class); 

封装条件,和criteria的api几乎一样. 

在dao层可以获取一个可执行的criteria对象 

Criteria c = dc.getExecutableCriteria(session);

 

Hibernate中多表查询(常用hql):

不使用迫切连接的时候返回值是 数组(每个对象) 

迫切: 可以将多个对象放入一个对象中(前提:必须有关联关系) 

写法: 只需要在 join 关键字后面加上 hibernate的关键字 "fetch" 

注意: 需要手动distinct 

例如: Query query = session.createQuery("select distinct xx from xxx join fetch xxx.属性引用"); 

内连接 :

显式内连接 

隐式内连接 

迫切内连接 

外连接 :

左外 

右外 

迫切左外连接

 

 

查询优化:

常见的优化策略: 

延迟加载(懒加载 lazy) 

使用的时候采取发送sql语句查询. 

分类: 类级别的延迟加载(一般使用,使用默认值) 

查询一个对象的时候是否使用懒加载 load方法 

关闭类级别的延迟加载: 

方式1: 持久化类使用final修饰. 

方式2: 修改映射文件 在class标签上添加 lazy="false" 

 

关联级别的延迟加载 

查询一个对象的关联对象的时候是否使用懒加载 

set标签上的lazy配置 true:使用懒加载 默认值 false:不使用懒加载 extra:极其懒惰 

many-to-one标签上配置 proxy:代理 默认值 决定权由一的一方是否使用懒加载决定 

lazy属性: 决定的是sql的发送时机. 。

抓取策略 决定的是发送sql的格式 。

set标签上fetch配置 :

select: 发送一条基本的查询语句 默认值 

subselect:发送一条子查询语句

join:发送的一条迫切左外连接语句 lazy属性失效了 

many-to-one标签上fetch配置:

select:发送一条基本的查询语句 默认值 

join:发送的一条迫切左外连接语句 lazy属性也失效了

 

 

批量抓取:

批量抓取: 查询多个对象的关联对象的时候,会发生(n+1)问题. 

 

查询所有一方,及其关联的多方的个数:

在一的一方的set标签上配置 batch-size=n 

n就是一次查询n个对象的关联对象 

查询所有多方,及其一方的名称 :

在一的一方的class标签上配置 batch-size=n 

n就是一次查询n个关联对象

 

 

 

转载于:https://my.oschina.net/u/3392125/blog/872245

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值