**1.1 对象导航查询 :**根据id查询某个客户,再查询这个客户里面所有的联系人
// 查询cid=2的客户,再查询这个客户的所有联系人Customer customer = (Customer.class, 2);// 查询到客户以后,直接得到联系人里面的set集合Set<LinkMan> linkmans = SetLinkMan();
**1.2OID查询:**调用session里面的get方法实现
Customer customer = (Customer.class, 2);
1.3HQL查询: hibernate query language,hibernate提供一种查询语言,hql语言和普通sql很相似,区别:普通sql操作数据库表和字段,hql操作实体类和属性
// 1创建Query对象,写hql语句
Query query = ateQuery("from Customer");// 2.调用方法得到结果List<Customer> list = query.list();
(2)条件查询
from 实体类名称 where 实体类属性名称=? and实体类属性名称=?
from 实体类名称 where 实体类属性名称 like ?
// 1 创建Query对象,写hql语句Query query = ateQuery("from Customer where cid=? and custName=?");// 2.设置条件值// setParameter 方法两个参数,第一个参数是?的位置,从0开始,第二个参数具体的值query.setParameter(0, 3);query.setParameter(1, "百度");// 调用方法得到结果List<Customer> list = query.list();
(3)排序查询
from 实体类名称 order by 实体类属性名称 asc/desc
Query query = ateQuery("from Customer order by cid asc");// 调用方法得到结果List<Customer> list = query.list();
(4)分页查询
//1. 创建Query query = ateQuery("from Customer ");// 设置分页数据// 2.1 设置开始位置query.setFirstResult(0);query.setMaxResults(3);// 调用方法得到结果List<Customer> list = query.list();
(5)投影查询: 查询的不是所有字段值,而是部分字段的值
select 实体类属性名称1, 实体类属性名称2 from 实体类名称,select 后面不能写 * ,不支持的
Query query = ateQuery("select custName from Customer ");List<Object> list = query.list();
(6)聚集函数使用
Query query = ateQuery("select count(*) from Customer ");// 调用方法得到结果// query对象里面有方法,直接返回对象形式Object obj = query.uniqueResult();//返回的值是long类型,不是int类型
4 QBC 查询
使用hql查询需要写hql语句实现,但是使用qbc时候,不需要写语句了,使用方法实现, 使用qbc时候,操作实体类和属性,使用qbc,使用Criteria对象实现
(1)查询所有
// 1创建对象Criteria criteria = ateCriteria(Customer.class);// 2 调用方法得到结果List<Customer> list = criteria.list();
(2)条件查询
// 1创建对象Criteria criteria = ateCriteria(Customer.class);// 2 使用criteria对象里面的方法设置条件值// 首先使用add方法,表示设置条件值,在add方法里面使用类的方法实现条件设置criteria.add(Restrictions.eq("cid", 3));criteria.add(Restrictions.eq("custName", "百度"));// 2 调用方法得到结果List<Customer> list = criteria.list();
(3)排序查询
Criteria criteria = ateCriteria(Customer.class);// 设置对哪个属性进行排序,设置排序规则criteria.addOrder(Order.asc("cid"));//升序List<Customer> list = criteria.list();
(4)分页查询
Criteria criteria = ateCriteria(Customer.class);// 设置分页数据// 设置开始位置criteria.setFirstResult(0);// 每页显示记录数criteria.setMaxResults(3);
(5)统计查询
Criteria criteria = ateCriteria(Customer.class);// 设置操作criteria.wCount());Long obj = (Long) criteria.uniqueResult();
(6)离线查询
应用场景: servlet调用service,service调用dao,在dao里面对数据库crud操作,在dao里面使用hibernate框架,使用hibernate框架时候,调用session里面的方法实现功能
// 1 创建对象DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);// 最终执行时才需要用到sessionCriteria criteria = ExecutableCriteria(session);List<Customer> list = criteria.list();
5 hql多表查询
(1)from Customer c inner join c.setLinkMan
// 1 创建query对象Query query = ateQuery("from Customer c inner join c.setLinkMan ");List list = query.list();
返回list,list里面每部分是数组形式。
**迫切内连接:**迫切内连接和内连接底层实现一样的,区别:使用内连接返回list中每部分是数组,迫切内连接返回list每部分是对象,只需要加一个关键字fetch
from Customer c inner join fetch c.setLinkMan
HQL左外连接
(1)from Customer c left outer join c.setLinkMan
(2)迫切左外连接from Customer c left outer join fetch c.setLinkMan
左外连接返回list中每部分是数组,迫切左外连接返回list每部分是对象
迫切左外连接
右外连接语句: from Customer c right outer join c.setLinkMan
6 hibernate的检索策略
(1)概念
立即查询:根据id查询,调用get方法,一调用get方法马上发送语句查询数据库
延迟查询:根据id查询,还有load方法,调用load方法不会马上发送语句查询数据,只有得到对象里面的值时候才会发送语句查询数据库
类级别延迟:根据id查询返回实体类对象,调用load方法不会马上发送语句
关联级别延迟
查询某个客户,再查询这个客户的所有联系人,查询客户的所有联系人的过程是否需要延迟,这个过程称为关联级别延迟
关联延迟是hibernate默认的,可以通过配置
1 在映射文件中进行配置实现
(1)根据客户得到所有的联系人,在客户映射文件中配置
2 在set标签上使用属性
(1)fetch:值select(默认)
(2)lazy:值
批量抓取
应用场景: 查询所有的客户,返回list集合,遍历list集合,得到每个客户,得到每个客户的所有联系人
上面操作代码,发送多条sql语句
在客户的映射文件中,set标签配置
batch-size值,值越大发送语句越少
本文发布于:2024-02-03 03:32:44,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170690236448377.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |