3.3Hibernate批量查询

1. HQL查询-hibernate Query Languagesql

Query表明面向对象的一个Hibernate查询操做。在Hibernate中,一般使用session.createQuery()方法接受一个HQL语句,而后调用Query的list()或uniqueResult()方法执行查询。所谓的HQL是Hibernate Query Language缩写,其语法很像SQL语法,但它是彻底面向对象的。数据库

在Hibernate中使用Query对象的步骤,具体所示:数组

  1. 得到Hibernate的Session对象;网络

  2. 编写HQL语句;session

  3. 调用session.createQuery建立查询对象;框架

  4. 若是HQL语句包含参数,则调用Query的setXxx设置参数;ide

  5. 调用Query对象的list()或uniqueResult()方法执行查询;函数

实例:spa

 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使用,会在后续讲解。hibernate

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     }
分页查询

相关文章
相关标签/搜索