mysql hql fetch_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个关联对象

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值