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 简介:
- Criteria对象,不写语句,背hibernate的方法
- 操纵实体
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 延迟查询也分为两类
-
类级别延迟: 调用load方法不会马上发送语句
-
关联级别延迟:查询客户的联系人是否需要延迟
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>