QBC 查询就是通过使用 Hibernate 提供的 Query By Criteria API 来查询对象,这种 API 封装了 SQL 语句的动态拼装,对查询提供了更加面向对象的功能接口
本地SQL查询来完善HQL不能涵盖所有的查询特性
步骤
- 创建criteria 对象
- 设置各种检索条件
- 执行检索
and 与 or
@Test
public void TestQbcAnd(){
Criteria criteria=session.createCriteria(Student.class);
//使用conjunction来表示and,本身也是一个criterion对象
Conjunction cons=Restrictions.conjunction();
cons.add(Restrictions.like("name", "s", MatchMode.ANYWHERE));
Grade grade=new Grade();
//criteria 对象添加criterion 对象
criteria.add(cons);
//System.out.println(criteria.list());
//使用disjunction表示or
Disjunction dis=Restrictions.disjunction();
dis.add(Restrictions.eq("gender", "男"));
dis.add(Restrictions.isNull("grade"));
criteria.add(dis);
System.out.println(criteria.list());
}
projection 统计查询
//统计查询
@Test
public void TestQbcPrejunction(){
Criteria criteria=session.createCriteria(Student.class);
//用projection来统计查询
criteria.setProjection(Projections.count("sid"));
System.out.println(criteria.uniqueResult());
}
添加排序和设置翻页
//添加排序
@Test
public void TestQbcOrder(){
Criteria criteria=session.createCriteria(Student.class);
//用projection来统计查询
criteria.addOrder(Order.desc("name"));
//设置翻页
int pageNo=2;
int pageSize=5;
criteria.setFirstResult((pageNo-1)*pageSize);
criteria.setMaxResults(pageSize);
System.out.println(criteria.list());
}
本地sql查询
- hql和qbc有局限。这时候就需要利用原生sql语句
@Test
public void TestQbcSql(){
String sql="insert into student (name) Values('ok')";
SQLQuery sqlQuery=session.createSQLQuery(sql);
sqlQuery.executeUpdate();
}
hql 也可以执行更新和删除
@Test
public void TestQbcUpdate(){
String hql="delete from Student s where s.name='ok'";
Query query=session.createQuery(hql);
query.executeUpdate();
}