Hibernate学习笔记4:hibernate的查询方式

这是黑马视频的学习笔记

hibernate的5种查询方式

对象导航查询

根据id查询某个客户,再查询这个客户里面所有的联系人
//根据cid=1查询客户,再查询这个客户里面所有的联系人
Customer customer=session.get(Customer.class, 1);
// 再查询此客户里面所有的联系人
//得到联系人的set集合
Set<LinkMan> linkMans= customer.getSetLinkMan();
				
System.out.println(linkMans.size());
				

OID查询

根据id查询某一条记录,返回对象

hql查询

使用Query对象,要写hql语句实现查询

1.创建Query对象,写hql语句。再调用query对象的方法查询得到结果

2.查询所有

查询所有客户记录

//创建Query对象
Query query=session.createQuery("from Customer");
//调用方法得到结果
List<Customer> list=query.list();
		    
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
			

3.条件查询

语句写法:from 实体类名 where 属性=?and 。。。。。

                 from 实体类名 where 属性 like ?

//创建Query对象
Query query=session.createQuery("from Customer c where c.cid=? and c.custName=?");
// 2 设置条件值 位置从0开始计数
query.setParameter(0, 1);
query.setParameter(1, "baidu");
			
//3.调用方法得到结果
List<Customer> list=query.list();
		    
for (Customer customer : list) {
	System.out.println(customer.getCid()+"::"+customer.getCustName());
}
//创建Query对象
Query query=session.createQuery("from Customer c where  c.custName like ?");
// 2 设置条件值 位置从0开始计数
query.setParameter(0, "%浪%");

//3.调用方法得到结果
List<Customer> list=query.list();
		    
 for (Customer customer : list) {
	System.out.println(customer.getCid()+"::"+customer.getCustName());
}
			

4.排序查询

form 实体类名 order by 属性 desc

//创建Query对象
Query query=session.createQuery("from Customer order by cid");
						
//3.调用方法得到结果
List<Customer> list=query.list();
		    
 for (Customer customer : list) {
	System.out.println(customer.getCid()+"::"+customer.getCustName());
}

5.分页查询

//创建Query对象
Query query=session.createQuery("from Customer");
//设置分页数据
query.setFirstResult(0);
query.setMaxResults(3);
			
//2.调用方法得到结果
List<Customer> list=query.list();
		    
 for (Customer customer : list) {
  System.out.println(customer.getCid()+"::"+customer.getCustName());
}

6.投影查询

查询不是所有字段值,而是部分字段的值

select 属性。。。 from 实体类名

//创建Query对象
Query query=session.createQuery("select custName from Customer");
			
//2.调用方法得到结果
List<Object> list=query.list();
		    
 for (Object object : list) {
System.out.println(object);
}

7.聚集函数使用

hql语法:select count(*) from 实体类名

	
//创建Query对象
Query query=session.createQuery("select count(*) from Customer");
	
//2.调用方法得到结果
Object object=query.uniqueResult();
 Long lobject=(Long)object;
 int count=lobject.intValue();
System.out.println(count);
		
			

QBC查询

使用Criteria对象

查询所有

Criteria criteria=session.createCriteria(Customer.class);		
@SuppressWarnings("unchecked")
List<Customer> list=criteria.list();
			
for (Customer customer : list) {
	System.out.println(customer.getCid()+"::"+customer.getCustName());
}

条件查询

//创建对象
Criteria criteria=session.createCriteria(Customer.class);
//使用criteria里面的方法设置条件值
//用add方法,表示设置条件值
//在add方法里面使用类的方法实现条件设置
//类似于cid=?
 criteria.add(Restrictions.eq("cid", 1));
criteria.add(Restrictions.eq("custName", "传智播客"));
				
List<Customer> list=criteria.list();
				
for (Customer customer : list) {
	System.out.println(customer.getCid()+"::"+customer.getCustName());
}
Criteria criteria=session.createCriteria(Customer.class);
				
criteria.add(Restrictions.like("custName", "%浪%"));
				
List<Customer> list=criteria.list();
				
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
				

排序查询

riteria criteria=session.createCriteria(Customer.class);
//设置对哪个属性进行排序,设置排序规则
criteria.addOrder(Order.desc("cid"));
					
@SuppressWarnings("unchecked")
List<Customer> list=criteria.list();
					
for (Customer customer : list) {
	System.out.println(customer.getCid()+"::"+customer.getCustName());
}
					

分页查询

Criteria criteria=session.createCriteria(Customer.class);
			
criteria.setFirstResult(0);
criteria.setMaxResults(3);
			
@SuppressWarnings("unchecked")
List<Customer> list=criteria.list();
	for (Customer customer : list) {			
System.out.println(customer.getCid()+"::"+customer.getCustName());
}

统计查询

Criteria criteria=session.createCriteria(Customer.class);
			
criteria.setProjection(Projections.rowCount());
			
Object object=criteria.uniqueResult();
			
Long lobject=(Long)object;
int count =lobject.intValue();
			
System.out.println(count);
			

离线查询

DetachedCriteria  detachedCriteria=DetachedCriteria.forClass(Customer.class);
			
Criteria criteria=detachedCriteria.getExecutableCriteria(session);
			
List<Customer> list=criteria.list();
	for (Customer customer : list) {			
System.out.println(customer.getCid()+"::"+customer.getCustName());
}

本地SQL查询

使用SQLQuery对象,要写sql语句

hql的多表查询

1.内连接

返回list,list里面是数组形式

Query query=session.createQuery("from Customer c inner join  c.setLinkMan");		
List   list=query.list();			

2.迫切内连接

迫切内连接和内连接的底层实现一样。但是迫切内连接返回的list中每部分是对象

Query query=session.createQuery("from Customer c inner join fetch  c.setLinkMan");		
List   list=query.list();
			

3.左外连接

返回list,list里面是数组形式

Query query=session.createQuery("from Customer c left outer join  c.setLinkMan");
List   list=query.list();

4.迫切左外连接

Query query=session.createQuery("from Customer c left outer join fetch  c.setLinkMan");
List   list=query.list();
迫切左外连接和左外连接的底层实现一样。但是迫切左外连接返回的list中每部分是对象

5.右外连接

类似左外连接

hibernate检索策略

1. 检索策略:hibernate检索策略分为   立即查询  和    延迟查询

立即查询:根据id查询,调用get方法,一调用get方法马上发送语句查询数据库

延迟查询:根据id查询,调用load方法,一调用load方法不会马上发送语句查询数据库。在得到对象里面的值时才会发送语句查询数据库

2. 延迟查询又分成 类级别延迟 和 关联级别延迟

类级别延迟:根据id查询返回实体类对象,调用load方法不会立刻发送查询语句

关联级别延迟: 查询一个客户,再查询这个客户的所有联系人。查询所有联系人的过程是否需要延迟。如果要延迟,就是关联级别延迟

3.关联级别延迟操作:

在映射文件中配置实现;根据客户得到所有联系人,要在客户的映射文件中配置

在set标签上使用两个属性,fetch=“select”(默认)。   lazy属性值  true(默认):延迟。    false:不延迟 。  extra:极其延迟

hibernate批量抓取

查询所有客户,返回list集合。遍历list集合,得到每个客户,再得到每个客户的所有联系人。

Criteria criteria=session.createCriteria(Customer.class);
			
			@SuppressWarnings("unchecked")
			List<Customer> list=criteria.list();
			
			for (Customer customer : list) {
				System.out.println(customer.getCid()+"::"+customer.getCustName());
			  //得到每个客户里面所有的联系人
				Set<LinkMan> linkMans=customer.getSetLinkMan();
				for (LinkMan linkMan : linkMans) {
					System.out.println(linkMan.getLkm_name());
				}
				

但是上面代码会发送多条sql语句,造成性能问题

2.解决方法:在客户的映射文件中的set标签中配置batch-size=“10”;数越大发送的语句越少,性能越高



猜你喜欢

转载自blog.csdn.net/shanshuisheng/article/details/80985479