1. HQL查询-hibernate Query Language
Query代表面向对象的一个Hibernate查询操作。在Hibernate中,通常使用session.createQuery()方法接受一个HQL语句,然后调用Query的list()或uniqueResult()方法执行查询。所谓的HQL是Hibernate Query Language缩写,其语法很像SQL语法,但它是完全面向对象的。
在Hibernate中使用Query对象的步骤,具体所示:
1. 获得Hibernate的Session对象;
2. 编写HQL语句;
3. 调用session.createQuery创建查询对象;
4. 如果HQL语句包含参数,则调用Query的setXxx设置参数;
5. 调用Query对象的list()或uniqueResult()方法执行查询;
实例:

1 @Test 2 public void demo9() { 3 // 1. 创建HQL语句 4 Transaction tx = session.beginTransaction(); 5 Query query = session.createQuery(" from Customer "); 6 // 2. 获取查询结果 7 List<Customer> list = query.list(); 8 System.out.println(list); 9 tx.commit(); 10 }

1 @Test 2 public void demo10() { 3 // 1. 创建HQL语句 4 Transaction tx = session.beginTransaction(); 5 Query query = session.createQuery(" from Customer where cust_id = ? "); 6 // 2.获取查询结果 7 query.setParameter(0, 5l); 8 Customer c = (Customer)query.uniqueResult(); 9 System.out.println(c); 10 tx.commit(); 11 } 12 13 @Test 14 public void demo11() { 15 // 1. 创建HQL语句 16 Transaction tx = session.beginTransaction(); 17 Query query = session.createQuery(" from Customer where cust_name = ? "); 18 // 2.获取查询结果 19 query.setString(0, "百度"); 20 Customer c = (Customer)query.uniqueResult(); 21 System.out.println(c); 22 tx.commit(); 23 }

1 @Test 2 public void demo12() { 3 // 1. 创建HQL语句 4 Transaction tx = session.beginTransaction(); 5 Query query = session.createQuery(" from Customer where cust_id = :cust_id and cust_name = :cust_name "); 6 // 2.获取查询结果 7 query.setParameter("cust_id", 1l); 8 query.setParameter("cust_name", "nakelulu"); 9 Customer c = (Customer)query.uniqueResult(); 10 System.out.println(c); 11 tx.commit(); 12 }

1 @Test 2 public void demo13() { 3 // 1. 创建HQL语句 4 Transaction tx = session.beginTransaction(); 5 Query query = session.createQuery(" from Customer "); 6 // 2.获取查询结果 7 query.setFirstResult(2); 8 query.setMaxResults(3); 9 List<Customer> c = query.list(); 10 System.out.println(c); 11 tx.commit(); 12 }
程序通过使用Query接口,将customer表中的三条数据全部输出。更详细的HQL使用,会在后续讲解。
Query中除了使用list()方法查询全部数据外,还有其它一些常用方法,具体如下:
1. setter方法:Query接口中提供了一系列的setter方法用于设置查询语句中的参数,针对不同的数据类型,需要用到不同的setter方法。
2. iterator()方法:该方法用于查询语句,返回的结果是一个Iterator对象,在读取时只能按照顺序方式读取,它仅把使用到的数据转换成Java实体对象。
3. executeUpdate()方法:该方法是Hibernate3的新特性,它支持HQL语句的更新和删除操作。
4. setFirstResult()方法:该方法可以设置获取第一个记录的位置,也就是它表示从第几条记录开始查询,默认从0开始计算。
5. setMaxResult()方法:该方法用于设置结果集的最大记录数,通常与setFirstResult()方法结合使用,用于限制结果集的范围,以实现分页功能。
总体来说:Hibernate独家查询语言,属于面向对象的查询语言,HQL查询-hibernate Query Language(多表查询,但不复杂时使用)。
2. Criteria--Hibernate自创的无语句面向对象查询,适用于--单表条件查询。
Criteria是一个完全面向对象,可扩展的条件查询API,通过它完全不需要考虑数据库底层如何实现,以及SQL语句如何编写,它是Hibernate框架的核心查询对象。Criteria查询,又称为QBC查询(Query by Criteria),它是Hibernate的另一种对象检索方式。
org.hibernate.criterion.Criterion是Hibernate提供的一个面向对象查询条件接口,一个单独的查询就是Citerion接口的一个实例,用于限制Criteria对象的查询,在Hibernate中Criterion对象的创建通常是通过Restrictions工厂类完成的,它提供了条件查询方法。
通常,使用Criteria对象查询数据的主要步骤,具体如下:
1. 获得Hibernate的Session对象。
2. 通过Session获得Criteria对象。
3. 使用Restrictions的静态方法创建Criterion条件对象。Restrictions类中提供了一系列用于设定查询条件的静态方法,这些静态方法都返回Criterion实例,每个Criterion实例代表一个查询条件。
4. 项Criteria对象中添加Criterion查询条件。Criteria的add()方法用于加入查询条件。
5. 执行Criteria的list()或uniqueResult()获得结果。
实例:

1 @Test 2 public void demo1() { 3 Transaction tx = session.beginTransaction(); 4 Criteria criteria = session.createCriteria(Customer.class); 5 List<Customer> list = criteria.list(); 6 System.out.println(list); 7 tx.commit(); 8 }

1 @Test 2 public void demo2() { 3 Transaction tx = session.beginTransaction(); 4 Criteria criteria = session.createCriteria(Customer.class); 5 criteria.add(Restrictions.eq("cust_name", "老王")); 6 List<Customer> list = criteria.list(); 7 System.out.println(list); 8 tx.commit(); 9 } 10 11 @Test 12 public void demo3() { 13 Transaction tx = session.beginTransaction(); 14 Criteria criteria = session.createCriteria(Customer.class); 15 criteria.add(Restrictions.eq("cust_name", "老王")); 16 criteria.add(Restrictions.eq("cust_source", "网络推广")); 17 List<Customer> list = criteria.list(); 18 System.out.println(list); 19 tx.commit(); 20 }

1 @Test 2 public void demo4() { 3 Transaction tx = session.beginTransaction(); 4 Criteria criteria = session.createCriteria(Customer.class); 5 criteria.add(Restrictions.eq("cust_name", "老王")); 6 criteria.add(Restrictions.eq("cust_source", "网络推广")); 7 criteria.setFirstResult(1); 8 criteria.setMaxResults(2); 9 List<Customer> list = criteria.list(); 10 System.out.println(list); 11 tx.commit(); 12 }

1 @Test 2 public void demo5() { 3 Transaction tx = session.beginTransaction(); 4 Criteria criteria = session.createCriteria(Customer.class); 5 criteria.setProjection(Projections.rowCount()); // 设置查询的聚合函数,总行数 6 Long count = (Long) criteria.uniqueResult(); 7 System.out.println(count); 8 tx.commit(); 9 }
在Criteria对象中,除了使用criteria.list()方法查询全部数据外,还有其它一些常用方法:如果只返回一个值时,可以使用criteria的uniqueResult()方法;如果需要分页时可以使用setFirstResult()和setMaxRequest()两个方法,setFirstResult()方法表示从第几条记录开始查询,setMaxRequest()方法表示查询几条记录。
3. SQLQuery---适用于复杂的业务查询
SQLQuery这个就比较简单了,这个接口用于接收一个sql语句进行查询,然后调用list()或者uniqueResult()方法进行查询。但是sql语句不会直接封装到实体对象中,需要我们手动写代码才可以封装到实体中。

1 @Test 2 public void demo1() { 3 Transaction tx = session.beginTransaction(); 4 SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer"); 5 List<Object[]> list = sqlQuery.list(); 6 for(Object[] object: list) { 7 System.out.println(Arrays.toString(object)); 8 } 9 tx.commit(); 10 }

1 @Test 2 public void demo2() { 3 Transaction tx = session.beginTransaction(); 4 SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer"); 5 sqlQuery.addEntity(Customer.class); 6 List<Customer> list = sqlQuery.list(); 7 for(Customer cust: list) { 8 System.out.println(cust); 9 } 10 tx.commit(); 11 }

1 @Test 2 public void demo3() { 3 Transaction tx = session.beginTransaction(); 4 SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer where cust_name=?"); 5 sqlQuery.setParameter(0, "网络推广"); 6 sqlQuery.addEntity(Customer.class); 7 List<Customer> list = sqlQuery.list(); 8 System.out.println(list); 9 }

1 @Test 2 public void demo4() { 3 Transaction tx = session.beginTransaction(); 4 SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer limit ?,?"); 5 sqlQuery.setParameter(0, 0); 6 sqlQuery.setParameter(1, 3); 7 sqlQuery.addEntity(Customer.class); 8 List<Customer> list = sqlQuery.list(); 9 System.out.println(list); 10 }