Hibernate_day04---HQL查询、QBC查询、多表查询、检索策略、批量抓取

版权声明:转载请联系作者本人!!! 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查询方法
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41307491/article/details/83189133
今日推荐