HQL查询能实现的使用Criteria查询也能实现,反之亦然,但在hibernate官网推荐HQL。
是hibernate中的QBC查询方式
QBC:Query By Criteria
获取对象
session.createCriteria(Class clazz);
涉及对象的方法
createCriteria(Class clazz);
参数含义
要查询的实体类的字节码
是一种更加面向对象的查询方式,把生成语句的过程都融入到方法之中,效率没有HQL高
基本查询
//基本查询
@Test
public void test1() {
Session s = HibernateUtils.getCurrentSession();
Transaction tx = s.beginTransaction();
//获取Criteria对象
Criteria c = s.createCriteria(Customer.class);
//获取结果集
List list = c.list();
for(Object o : list) {
System.out.println(o);
}
tx.commit();
}
条件查询
//条件查询
@Test
public void test2() {
Session s = HibernateUtils.getCurrentSession();
Transaction tx = s.beginTransaction();
//获取Criteria对象
Criteria c = s.createCriteria(Customer.class);
//使用Criteria中的add方法添加条件
c.add(Restrictions.eq("custLevel", "23"));
c.add(Restrictions.like("custName", "%集%"));
//获取结果集
List list = c.list();
for(Object o : list) {
System.out.println(o);
}
tx.commit();
}
排序查询
@Test
public void test3() {
Session s = HibernateUtils.getCurrentSession();
Transaction tx = s.beginTransaction();
//获取Criteria对象
Criteria c = s.createCriteria(Customer.class);
//添加排序
c.addOrder(Order.desc("custId"));
//获取结果集
List list = c.list();
for(Object o : list) {
System.out.println(o);
}
tx.commit();
}
分页查询
@Test
public void test4() {
Session s = HibernateUtils.getCurrentSession();
Transaction tx = s.beginTransaction();
//获取Criteria对象
Criteria c = s.createCriteria(Customer.class);
//设置分页条件
c.setFirstResult(0);
c.setMaxResults(2);
//获取结果集
List list = c.list();
for(Object o : list) {
System.out.println(o);
}
tx.commit();
}
统计查询
//统计(投影)查询
@Test
public void test5() {
Session s = HibernateUtils.getCurrentSession();
Transaction tx = s.beginTransaction();
//获取Criteria对象
Criteria c = s.createCriteria(Customer.class);
//设置实用聚合函数
// c.setProjection(Projections.rowCount());
c.setProjection(Projections.count("custId"));
//获取结果集
// List list = c.list();
// for(Object o : list) {
// System.out.println(o);
// }
Long count = (Long)c.uniqueResult();
System.out.println(count);
tx.commit();
}
离线查询
//离线查询
@Test
public void testServlet() {
//获取离线对象,不需要session
DetachedCriteria dc = DetachedCriteria.forClass(Customer.class);
//封装查询条件
dc.add(Restrictions.eq("custLevel", "23"));
dc.add(Restrictions.like("custName", "%集%"));
List list = testService(dc);
for(Object o : list) {
System.out.println(o);
}
}
private List testService(DetachedCriteria dc) {
Session s = null;
Transaction tx = null;
try {
// TODO 自动生成的方法存根
s = HibernateUtils.getCurrentSession();
tx = s.beginTransaction();
List list = testDao(dc);
tx.commit();
return list;
}catch(Exception e){
tx.rollback();
}
return null;
}
private List testDao(DetachedCriteria dc) {
// TODO 自动生成的方法存根
Session s = HibernateUtils.getCurrentSession();
//把离线对象转成在线对象
Criteria c = dc.getExecutableCriteria(s);
return c.list();
}
}
为了避免传参过多,对象过多,使用离线查询解决