3.3Hibernate批量查询

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     }
基本查询 返回数组list
 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     }
基本查询 返回对象list
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     }
分页查询

猜你喜欢

转载自www.cnblogs.com/eaglesour/p/9494417.html