Hibernate---QBC检索与本地SQL检索

一.概述

QBC 查询就是通过使用 Hibernate 提供的 Query By Criteria API 来查询对象,这种 API 封装了 SQL 语句的动态拼装,对查询提供了更加面向对象的功能接口
本地SQL查询来完善HQL不能涵盖所有的查询特性



二.QBC检索


在Hibernate应用中使用QBC查询通常经过3个步骤 
  (1)使用Session实例的createCriteria()方法创建Criteria对象 

  (2)使用工具类Restrictions的相关方法为Criteria对象设置查询对象
 
  (3)使用Criteria对象的list()方法执行查询,返回查询结果 
@Test
	public void testInnerJoinFetch() {
//1.创建一个Criteria对象	
		Criteria  criteria=session.createCriteria(Department.class);
//2.添加查询条件
		criteria.add(Restrictions.idEq(1));
//3.执行查询
		List<Department> departments=criteria.list();
		for (Department department : departments) {
			System.out.println("部门名:"+department.getDeptName()+",部门人数:"+department.getEmps().size());
			Set<Employee> emp=department.getEmps();
			for (Employee employee : emp) {
				System.out.print(employee.getEmpName());
			}
		}
}
}	

Restrictions类的常用方法 

Restrictions.eq(String propertyName,Object value) 
等于 
Restrictions.allEq(Map propertyNameValues) 
使用Map key/value进行多个等于的比对 
Restrictions.gt(String propertyName, Object value) 
大于 >    (gt----->greater than) 
Restrictions.ge(String propertyName, Object value) 
大于等于 >=    (ge----->greater equal) 
Restrictions.It(String propertyName, Object value) 
小于< (It---->less than) 
Restrictions.Le(String propertyName, Object value) 
小于等于<= (le---->less equal) 
Restrictions.between(String propertyName, Object lo, Object hi) 
对应SQL语句的Between子句 
Restrictions.like(String propertyName, Object value) 
对应SQL语句的LIKE子句 
Restrictions.in(String propertyName, Collection value) 
对应SQL语句的in子句 
Restrictions.and(Criterion lhs, Criterion rhs) 
And关系 
Restrictions.or(Criterion lhs, Criterion rhs) 
Or关系 
Restrictions.sqlRestriction(String sql,Object[] values,Type[] types) 
SQL限定查询 
--------------------------------------------------------------------------------------------------------------------------------------------------

          工具类Order提供设置排序方式 
Order.asc(String propertyName) 
升序排序 
Order.desc(String propertyName) 
降序排序 
排序查询:
    
	@Test
	public void testInnerJoinFetch() {
//1.创建一个Criteria对象	
		Criteria  criteria=session.createCriteria(Employee.class);
//2.添加查询条件
		criteria.addOrder(Order.asc("age"));
//3.执行查询
		List<Employee> list=criteria.list();
		for (Employee employee : list) {
			System.out.println(employee);
		}
}

--------------------------------------------------------------------------------------------------------------------------------------------------

         工具类Projections提供对查询结果进行统计与分组操作 
Porjections.avg(String propertyName) 
求某属性的平均值 
Projections.count(String propertyName) 
统计某属性的数量 
Projections.countDistinct(String propertyName) 
统计某属性的不同值的数量 
Projections.groupProperty(String propertyName) 
指定一组属性值 
Projections.max(String propertyName) 
某属性的最大值 
Projections.min(String propertyName) 
某属性的最小值 
Projections.projectionList() 
创建一个新的projectionList对象 
Projections.rowCount() 
查询结果集中记录的条数 
Projections.sum(String propertyName) 
返回某属性值的合计 


聚合查询:
查询年龄最大的
@Test
	public void testInnerJoinFetch() {
//1.创建一个Criteria对象	
		Criteria  criteria=session.createCriteria(Employee.class);
		ProjectionList projList = Projections.projectionList(); 
//2.添加查询条件
		projList.add(Projections.max("age"));
		criteria.setProjection(projList);
//3.执行查询
		List<Employee> list=criteria.list();
		System.out.println(list);
}
}	

分页查询:
* QBC的分页查询也是使用两个方法
* setFirstResult();
* setMaxResults();

@Test
	public void testInnerJoinFetch() {
//1.创建一个Criteria对象	
		Criteria  criteria=session.createCriteria(Employee.class);
//2.添加查询条件
		criteria.setFirstResult(1).setMaxResults(3).setMaxResults(3);
//3.执行查询
		List<Employee> list=criteria.list();
		for (Employee employee : list) {
			System.out.println(employee);
		}
}
}	

三.本地查询

@Test
public void testAdd() {
	String hql2="insert into employees values(?,?,?,?,?)";
	session.createSQLQuery(hql2).setInteger(0, 32)
	                            .setString(1, "小明")
	                            .setString(2, "25")
	                            .setString(3, "123456")
	                            .setInteger(4, 2)
	                            .executeUpdate();
}	

executeUpdate()方法支持增删改
注意:hql语句中的是表格名而不是实体类名


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值