一、QBC概述
QBC 查询就是通过使用 Hibernate 提供的 Query By Criteria API
来查询对象,这种 API 封装了 SQL 语句的动态拼装,对查询提供了更加面向对象的功能接口
二、QBC的几种方式
1、普通查询
@Test
public void testQBC(){
//1.创建一个Criteria对象
Criteria criteria = session.createCriteria(Employee.class);
//2.添加查询条件:在QBC中查询条件使用Criterion来表示。Criterion可以通
// 过Restrictions的静态方法得到
criteria.add(Restrictions.eq("email","bb@163.com"));
criteria.add(Restrictions.eq("salary",1250F));
//3.执行查询
Employee employee = (Employee) criteria.uniqueResult();
System.out.println(employee);
}
2、AND/OR
- AND使用Conjunction表示
- OR使用Disjunction表示
@Test
public void testQBC2(){
Criteria criteria = session.createCriteria(Employee.class);
//1.AND 使用Conjunction表示,Conjunction本身就是一个Criteria对象,且其中
// 还可以添加Criteria对象
Conjunction conjunction = Restrictions.conjunction();
conjunction.add(Restrictions.like("email","qq", MatchMode.ANYWHERE));
Department dept = new Department();
dept.setId(2);
conjunction.add(Restrictions.eq("dept",dept));
System.out.println(conjunction);
//2.OR 使用Disjunction表示
Disjunction disjunction = Restrictions.disjunction();
disjunction.add(Restrictions.ge("salary",1000F));
disjunction.add(Restrictions.isNull("email"));
criteria.add(disjunction);
criteria.add(conjunction);
criteria.list();
}
3、统计查询
- 统计查询:使用Projections的静态方法得到
@Test
public void testQBC3(){
Criteria criteria = session.createCriteria(Employee.class);
//统计查询:使用Projections的静态方法得到
criteria.setProjection(Projections.max("salary"));
System.out.println(criteria.uniqueResult());
}
4、排序和翻页
@Test
public void testQBC4(){
Criteria criteria = session.createCriteria(Employee.class);
//1.添加排序:
criteria.addOrder(Order.asc("salary")).addOrder(Order.desc("email"));
//添加翻页方法
int pageSize = 4;
int pageNo = 1;
criteria.setFirstResult((pageNo - 1) * pageSize).setMaxResults(pageSize).list();
}
三、本地SQL概述
本地SQL查询来完善HQL不能涵盖所有的查询特性。
四、本地SQL使用案例
//本地SQL插入操作
@Test
public void testNativeSQL(){
String sql = "INSERT INTO department values(?,?)";
SQLQuery query = session.createSQLQuery(sql);
query.setInteger(0,10).setString(1,"策划部").executeUpdate();
}
与HQL对比:
删除指定ID的Department对象
@Test
public void testHQLUpdate(){
String hql = "delete from Department d where d.id=?";
session.createQuery(hql).setInteger(0,10).executeUpdate();
}