Hibernate学习笔记④
Hibernate查询
(1)对象导航查询
【简单】
【业务需求实例】查询某个客户公司的所有联系人
【实现思路】使用session.get获取客户对象,在用获取的对象调用getSet获取所有属于该公司的联系人即可
(2)OID查询【根据id查询就是oid查询】
(3)HQL查询
【重要】【常用】
【常用的HQL语句】
- 查询所有 【from 实体类名称】
- 条件查询 【from 实体类名称 [实体类别名] where [实体类别名.]实体类属性名称=?and [实体类别名.]实体类属性名称=?】【模糊查询 直接加like就行了】
Query query = session.createQuery("from Client where cName = ?"); query.setParameter(0, "baidu"); //问号的位置是从0开始的,使用setParameter()方法
//模糊查询
//假设数据库中有一条 新浪 的数据
Query query = session.createQuery("from Client where cName like ?");
query.setParamter(0,"%浪%"); - 排序查询 【from 实体类名称 order by 实体类属性名称 desc/asc】
- 分页查询 Hibernate封装了两个方法用来实现分页
//设置分页数据 //设置开始位置 query.setFirstResult(0); //设置每一页的数目 query.setMaxResults(2);
- 投影查询 【什么是投影查询 查询部分字段的值而不是所有的值】【from 实体类属性名 from 实体类名称】
- 聚集函数使用 【常用聚集函数 count max min sum avg】
Query query = session.createQuery("select count(*) from Client"); //返回一个对象而不是list Object obj = query.uniqueResult(); //将Object转换成int形 //obj返回的是long类型,首先需要将Object变成Long类型 Long longObj = (Long)obj; int i = longObj.intValue();
/*也可以在使用uniqueResult的时候直接声明为Long类型,在转换即可*/
(4)QBC查询【很多人常用??】
QBC不需要使用HQL,使用方法查询。
使用Criteria对象实现
查询
Criteria criteria = session.createCriteria(Client.class);
条件查询
Criteria criteria = session.createCriteria(Client.class) criteria.add(Restrictions.eqProperty(propertyName, otherPropertyName));
模糊查询
Criteria criteria = session.createCriteria(Client.class); criteria.add(Restrictions.like(propertyName, value,));
Restrictions类是QBC查询中很重要的一个类,里面有很多static方法,大多是设置条件
排序
criteria.addOrer(Order.asc(propertyName))
Order.asc --> 根据传入的字段进行升序排序
Order.desc --> 根据传入的字段进行降序排序
分页查询
调用方法与HQL一样
分页起始页计算公式:(当前页-1)*每一页的记录数
Hibernate多表查询
多表查询有:
- 内连接 【查询显示出和两个表都有关系的条目】
select * from t_table1 t1,t_table2 t2 where t1.cid = t2.uid 或者 select * from t_table1 t1 INNER JOIN t_table2 t2 ON t1.cid = t2.uid
- 左外链接 【查询出左表的全部和右表中和左表有关系的条目】
select * from t_table1 t1 LEFT OUTER JOIN t_table2 t2 ON t1.cid = t2.uid
- 右外链接 【与左链接相反 查询出右表的全部和左表中和右表有关系的条目】
HQL实现多表查询
HQL实现多表查询有下面几种类型:内连接 左外 右外 迫切内连接 迫切左外链接
(1)内连接
只需要记住内连接HQL查询语句
from Client c inner join c.belongContacter【表示类内表示多的Set集合的属性名】
Query query = session.createQuery("from Client c inner join c.belongContecter"); //使用内连接查询返回的List中返回的每个元素是数组的形式 List joinList = query.list();
(2)迫切内连接
【HQL】 from Client c inner join fetch c.belongContacter
【与内连接区别】 内连接返回的List是数组 而迫切内连接返回的List中的每个元素是对象的形式
(3)左外连接
【HQL】 from Client c left outer join c.belongContacter
(4)迫切左外链接
【HQL】 from Client c left outer join fetch c.belongContacter
(5)右外连接
【HQL】 from Client c right outer join c.belongContacter
Hibernate检索策略
【Hibernate检索策略分类】分为立即查询和延迟查询
【立即查询】如果根据id查询 马上发送请求查询数据库
【延迟查询】不会马上查询数据库 使用load()方法进行延迟查询 只有得到对象里面的值的时候才会发送语句进行查询
Client client = session.load(Client.class, 1);
此时的client对象里面只有一个id值为1,当我们试图获取client的更多属性比如获取用户的名称,client.getClientName,此时Hibernate才会发送SQL请求查询返回查询结果。
【延迟查询分类】 分为类级别延迟和关联级别延迟
【类级别延迟】 load方法就是类级别延迟,查询的对象是某个实体类
【关联级别延迟】 查询实体类的关联实体类的过程的延迟,在实体类的配置文件的set标签中进行配置【一般不用修改】
lazy=extra 【及其懒惰】 要什么值给你查询什么值
【批量抓取】
【使用场景】需要获取所有客户的所有联系人
【使用方法】设置配置文件中的<set>标签的batch-size属性 只要给个整数就可以了 这个值越大效率越高