您的位置:首页 > 数据库

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

2017-09-22 17:21 381 查看

一.概述

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语句中的是表格名而不是实体类名
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: