当前位置:   article > 正文

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

hibanate异步查询

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

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

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

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

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

3、hql查询

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

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

Query query = session.createQuery("语句");
List<Company> list = query.list();
  • 1
  • 2
  • 查询所有 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,"%浪");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 排序查询(查询结果按序展示)

SQL:

select * from t_company order by cid ASC(DESC)
  • 1

HQL:

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

Mysql:使用limit

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

hql:不认识limit

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

sql:

select cid,custName from t_table;
  • 1

hql:

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

  • 1
  • 2
  • 3
  • 聚集函数的使用
    count,sum,avg,max,min
select count(*) from t_tables;
  • 1
createQuery("select count(*) from 实体类");
Object obj = query.uniqueResult();
  • 1
  • 2
  • 实现多表查询
    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;
  • 1
  • 2

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

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

3、右外连接

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

HQL:
1、内连接

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

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

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

from Customer c left outer join c.setLinkMan
  • 1

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

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());//发送语句
  • 1
  • 2
  • 3
6.3 延迟查询也分为两类
  1. 类级别延迟: 调用load方法不会马上发送语句

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

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

在set标签上的属性

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

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

</set>
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/185271
推荐阅读
相关标签
  

闽ICP备14008679号