SSH框架学习之Hibernate ---- 4、Hibernta的查询操作API

1、对象导航查询,很普通

(1) 根据ID查询某个客户,再查询这个客户里面的所有联系人

Customer customer = session.get(Customer.class,1);
Set<LinkMan> linkman = customer.getSetLinkMan();

2、OID查询,跟上面的一模一样

(1) 根据ID查询某一条记录,返回对象形式

3、hql查询

和普通SQL区别在于,数据库和实体类互换

第一步:创建Query对象,写hql语句
第二步:调用query里面的方法得到结果

Query query = session.createQuery("语句");
List<Company> list = query.list();
  • 查询所有 from 实体类的名字
  • 条件查询(where xxx = ‘’)
Query query = session.createQuery("from 实体类名称 where username=? and uid=?")
//向?设值
query.setParameter(0,"张三");
query.setParameter(1,2);

//模糊查询
Query query = session.createQuery("from 实体类名称 where username like ?")
query.setParameter(0,"%浪");
  • 排序查询(查询结果按序展示)

SQL:

select * from t_company order by cid ASC(DESC)

HQL:

懒!把语句进去即可
  • 分页查询(查询结果分页)

Mysql:使用limit

select * from t_table limit 0,3 // 每页显示三条记录

hql:不认识limit

query.setFirstResult(0);//设置开始位置
query.setMaxResult(3);//每页记录数
  • 投影查询(查部分字段,并非所有字段)

sql:

select cid,custName from t_table;

hql:

Query query = session.createQuery("select custName from Customer");
List<Object>list = quert.list();

  • 聚集函数的使用
    count,sum,avg,max,min
select count(*) from t_tables;
createQuery("select count(*) from 实体类");
Object obj = query.uniqueResult();
  • 实现多表查询
    Mysql:
    1、内连接
select * from t_customer,t_linkman where c.cid = l.cid;
SELECT * FROM t_customer c INNER JOIN t_linkman l ON c.cid = l.cid;

2、左外连接(得到的结果为,左边的表的全部,右边表的关联数据)

SELECT * FROM t_customer c LEFT OUTER JOIN t_linkman l ON c.cid = l.cid;

3、右外连接

SELECT * FROM t_customer c RIGHT OUTER JOIN t_linkman l ON c.cid  = l.cid;

HQL:
1、内连接

语句:
from Customer c inner join c.setLinkMan //

代码:
Query query = session.createQuery("from Customer c inner join c.setLinkMan")
List list = query.list();//返回数组形式

2、左外连接(得到的结果为,左边的表的全部,右边表的关联数据)

from Customer c left outer join c.setLinkMan

3、右外连接

4、QBC查询

4.1 简介:
  1. Criteria对象,不写语句,背hibernate的方法
  2. 操纵实体
4.2 代码:
Criteroa criteria = session.createCriteria(Company.class);
// 1、查询所有
list = criteria.list();
// 2、条件查询
//1)、使用add方法,表示条件
//2)、调用Retri的静态方法
criteria.add(Restrictions.eq("cid",1));// cid == 1;
criteria.add(Restrictions.eq("cname","老王"));// cname == 老王;

// 3、排序查询
criteria.addOrder(Order.asc("cid"));
// 4、分页
//1)设置开始位置
//2)设置每页记录数
criteria.setFirstResult(0);
criteria.setMaxResults(3);
//5、统计查询
criteria.setProjection(Projections.rowCount());
Object obj = criteria.uniqueResult();
Long lobj = (Long) obj;

//6、离线查询(不用session)
//1)创建对象
DetachedCriteria dC = DeterchedCriteria.forClass(Company.class);
//2)执行的时候,才需要session
Criteria criteria = dc.getExecutableCriteria(session);

5、本地sql查询

(1)SQLQuery对象,使用普通sql实现

6、Hibernate检索策略

6.1 立即查询:

根据id查询,调用get方法,一调用get方法马上发送语句查询

6.2 延迟加载:

调用方法不会马上发送语句,什么时候用,才去查数据库,不用的时候不回去查数据库。

Customer customer = session.load(Customer.class,2);// 此时不会发送sql语句
printf(customer.getCid());//获得Cid 也不发送sql语句
printf(customer.getCustName());//发送语句
6.3 延迟查询也分为两类
  1. 类级别延迟: 调用load方法不会马上发送语句

  2. 关联级别延迟:查询客户的联系人是否需要延迟

6.4 默认的效果:
Set<LinkMan> linkMan = customer.getSetLinkMan();// 不发送语句
print(linkMan.size());//要用的时候,才查询sql
6.5 修改延迟操作(通过配置)

在set标签上的属性

(1) fetch: 值select(默认)
(2) lazy: true(默认)、false、extra(极其懒惰)

<set name="setLinkMan" fecth="select" lazy="true">

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值