什么是hibernate的QBC查询
- QBC 查询就是通过使用 Hibernate 提供的 Query By Criteria API 来查询对象,这种 API 封装了 SQL 语句的动态拼装,对查询提供了更加面向对象的功能接口
- 示例代码:
/*
* 第一个QBC查询(完全是基于对象的查询操作,更加方便)
*/
@Test
void testQBC() {
//1. 创建criteria对象
Criteria criteria = this.session.createCriteria(Employee.class);
//2. 添加查询条件:在QBC中查询条件使用criterion来表示,criterion可以通过Restrictions的静态方法获取
criteria.add(Restrictions.eq("email", "23@qq.com"));
criteria.add(Restrictions.gt("salary", 100F));
//执行查询(两种方法都可以)
// Object result = criteria.uniqueResult();
// System.out.println(result);
List<Employee> result = criteria.list();
System.out.println(result.get(0));
}
console:
- 示例代码2
/*
* 通过QBC实现and以及or查询
*/
@Test
void testQBC2() {
Criteria criteria = this.session.createCriteria(Employee.class);
//1. AND 查询
Conjunction conjunction = Restrictions.conjunction();
conjunction.add(Restrictions.like("name", "ja", MatchMode.ANYWHERE));
Department dept = new Department();
dept.setId(1);
conjunction.add(Restrictions.eq("department", dept));
// System.out.println(conjunction);
//2. OR 查询
Disjunction disjunction = Restrictions.disjunction();
disjunction.add(Restrictions.ge("salary", 1000F));
disjunction.add(Restrictions.isNull("email"));
criteria.add(disjunction);
criteria.add(conjunction);
criteria.list();
}
console:
- 示例代码3
/*
* 使用QBC进行统计查询
*/
@Test
void testQBC3() {
Criteria criteria = this.session.createCriteria(Employee.class);
// 统计查询:使用Projection 来表示,可以由Projections 的静态方法获取
criteria.setProjection(Projections.max("salary"));
System.out.println(criteria.uniqueResult());
}
console:
- 示例代码4
/*
* 使用QBC进行排序和分页查询
*/
@Test
void testQBC4() {
Criteria criteria = this.session.createCriteria(Employee.class);
//1. 添加排序
criteria.addOrder(Order.asc("salary"));
criteria.addOrder(Order.desc("id"));
//2. 添加分页
int pageNo = 1;
int pageSize = 2;
criteria.setFirstResult((pageNo-1) * pageSize).setMaxResults(pageSize);
criteria.list();
}
console:
hibernate对于本地sql语句的支持
- 示例代码:
/*
* hql 主要是运用在查询和更新以及删除,其不支持增加
* QBC 主要是运用简单的查询(方便,快捷)
* 而 本地sql 可以实现所有的功能
*/
@Test
void testNativeSql() {
String sql = "insert into GG_DEPARTMENT values (?,?)";
NativeQuery query = this.session.createSQLQuery(sql);
query.setInteger(0, 123).setString(1, "开发部").executeUpdate();
}
console:
- hql还可以实现很好的数据更新和删除操作
/*
* 测试hql的更新和删除
*/
@Test
void testHQLUpdate() {
// String hql = "update Department d set d.name = :name where d.id = :id";
// Query query = this.session.createQuery(hql);
// query.setParameter("name", "搞基部").setParameter("id", 123);
// query.executeUpdate();
//
String hql = "delete from Department d where d.id = :id";
this.session.createQuery(hql).setParameter("id", 123).executeUpdate();
}
console:
后台数据库: