版权声明:转载请联系作者本人!!! https://blog.csdn.net/qq_41307491/article/details/83189133
一、Hibernate查询方式及结果存放
查询方式(五种)
1)对象导航查询 :一对多中,查询某个"一"对应的所有"多"
2)OID查询: 根据id查询某一条记录,返回对象
3)HQL查询: 使用Query对象,内置hql语句实现查询。
4)QBC查询:使用Criteria对象
5)本地sql查询:SQLQuery对象,使用普通sql实现查询
查询结果的存放
1)查询结果为:多个类对象:List<类名> 使用.list()方法
2)查询结果为:多个类属性:List<Object> 使用.list()方法
3)查询结果为:单个结果:Object 使用.uniqueResult()方法
二、HQL查询与QBC查询详解:
HQL查询
使用Query对象,内置hql语句实现查询。
与SQL区别:普通sql操作数据库表和字段,hql操作实体类和属性
(1)查询所有
hql语法:from 实体类名称
步骤:
1.创建 Query对象,初始化hql语句(from 实体类名称)
2.调用list方法得到结果
3.遍历输出结果
//1.创建 Query对象,初始化hql语句
Query query = session.createQuery("from Customer");
//2.调用list方法得到结果
List<Customer> list = query.list();
//3.遍历输出结果
for (Customer customer : list) {
System.out.println(customer.getCid() +": "+ customer.getCustName());
}
(2)条件查询
步骤:
1.创建 Query对象,初始化hql语句(设置条件参数)
2.设置条件值 setParameter(?位置,参数值)
3.调用list方法得到结果
//1.创建 Query对象,初始化hql语句(设置条件参数)
Query query = session.createQuery("from Customer c WHERE c.cid = ? AND c.custName = ?");
//2.设置条件值 setParameter(?位置,参数值)
query.setParameter(0, 1);
query.setParameter(1, "百度");
//3.调用list方法得到结果
List<Customer> list = query.list();
模糊条件查询示例
//1.创建 Query对象,初始化hql语句(设置条件参数)
Query query = session.createQuery("from Customer c WHERE c.custName like ?");
//2.设置条件值 setParameter(?位置,参数值)
query.setParameter(0, "%百%");
(3)排序查询
hql语法:from 实体类名称 ORDER BY 属性名 ASC/DESC
//1.创建 Query对象,初始化hql语句(设置升/降序)
Query query = session.createQuery("from Customer ORDER BY cid DESC");
//2.调用list方法得到结果
List<Customer> list = query.list();
(4)分页查询
**需要设置开始位置、每页记录数
//1.创建 Query对象,初始化hql语句
Query query = session.createQuery("from Customer");
//2.设置开始位置、每页记录数
query.setFirstResult(0); //设置起始位置为0
query.setMaxResults(2); //设置每页记录数为2
//3.调用list方法得到结果
List<Customer> list = query.list();
(5)投影查询(只查询指定字段的值)
hql语法:select 类属性名 from 类名
结果使用Object接收
//1.创建 Query对象,初始化hql语句
Query query = session.createQuery("select custName from Customer");
//2.调用list方法得到结果
List<Object> list = query.list();
//3.遍历输出结果
for (Object object : list) {
System.out.println(object);
}
(6)聚集函数使用
常用的聚集函数:count(统计)、sum(求和)、avg(求平均)、max(求最大)、min(求最小)、
hql语句:select count(*) from 实体类名称
//1.创建 Query对象,初始化hql语句
Query query = session.createQuery("select count(*) from Customer");
//2.调用unique方法得到结果
Object obj = query.uniqueResult();
注:Object不能直接转换成Int类型! 需要先转化为Long,再由Long转换为Int
QBC查询
核心操作:
1.使用Criteria对象中的方法查询、2.操作实体类和属性、3.不需要写查询语句
(1)查询所有
//1.创建 Criteria对象.
Criteria criteria = session.createCriteria(Customer.class);
//2.调用list方法得到结果
List<Customer> list = criteria.list();
(2)条件查询
方法: criteria.add(Restrictions.eq("条件字段名",条件值));
//1.创建 Criteria对象.
Criteria criteria = session.createCriteria(Customer.class);
//2.使用方法设置条件及条件值
criteria.add(Restrictions.eq("cid", 1));
criteria.add(Restrictions.eq("custName", "百度"));
//模糊查询
//criteria.add(Restrictions.like("custName", "%百%"));
//3.调用list方法得到结果
List<Customer> list = criteria.list();
(3)排序查询
//1.创建 Criteria对象.
Criteria criteria = session.createCriteria(Customer.class);
//2.设置排序规则,设置排序参数
criteria.addOrder(Order.asc("cid")); //升序
criteria.addOrder(Order.desc("cid")); //降序
//3.调用list方法得到结果
List<Customer> list = criteria.list();
(4)分页查询
//1.创建 Criteria对象.
Criteria criteria = session.createCriteria(Customer.class);
//2.设置分页数据(开始位置、每页记录数)
criteria.setFirstResult(0); //设置开始位置
criteria.setMaxResults(3); //设置每页记录数
//3.调用list方法得到结果
List<Customer> list = criteria.list();
(5)统计查询
//1.创建 Criteria对象.
Criteria criteria = session.createCriteria(Customer.class);
//2.设置统计行操作
criteria.setProjection(Projections.rowCount());
//3.查询
Object obj = criteria.uniqueResult();
(6)离线查询
实现基本:跳过session直接创建Criteria
作用:可在servlet中传入查询条件
//1.使用DetachedCriteria类,离线创建 Criteria对象.
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
//2.最终执行时再传入session
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
//3.执行查询
List<Customer> list = criteria.list();
三、多表查询
Mysql多表查询:
(1)内连接:只查询显示两表中关联的数据
(2)左外连接:左边表全部显示,右边表只查询显示关联数据
(3)右外连接:右边表全部显示,左边表只查询显示关联数据
Hql多表查询:
(1)内连接 与 迫切内连接
相同点:语法相同,底层实现相同。
不同点:
HQL语句不同:
内连接:from 实体类 别名 inner join 别名.另一个表
迫切内连接: from 实体类 别名 inner join fetch 别名.另一个表
结果不同:
内连接:返回为 数组形式
迫切内连接:返回为 对象形式
(2)左外连接 和 迫切左外连接
相同点:语法相同,底层实现相同。
不同点:
HQL语句不同:
内连接:from 实体类 别名 left outer join 别名.另一个表
迫切内连接: from 实体类 别名 left outer join fetch 别名.另一个表
结果不同:
内连接:返回为 数组形式
迫切内连接:返回为 对象形式
(3)右外连接
HQL语句:from 实体类 别名 right outer join 别名.另一个表
注:不存在迫切右外连接!
四、hibernate检索策略
检索策略分为两类:
1)立即查询:调用get方法(根据id查询)。
get方法被调用会马上发送语句查询数据库
2)延迟查询:
延迟:是查询语句向数据库发送时机的延迟。
做法:调用load查询(根据id查询)。
load方法需要在具体执行时(得到对象属性值时)才会发送语句查询数据库。
延迟类别(两种):
1)类级别延迟:得到对象属性值之前的延迟。
2)关联级别延迟(默认)。
背景:先查询某个客户,再查询客户中所有联系人
延迟处于:查询客户之后,查询客户联系人之前的延迟
五、批量抓取
应用场景:当我们想获取全部的商品类别,然后在获取所有类别下面的商品时。
问题:每次查询类别时,都会发送语句。
解决:设置每条语句抓取采集的数据数目。
使用方法:在客户的映射文件中,配置set标签属性 -- batch-size值(值越大发送语句越少)
附录:
1)检索策略
2)QBC查询方法