zoukankan      html  css  js  c++  java
  • 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     }
    分页查询

  • 相关阅读:
    nutch 存储到数据库
    66、多种多样的App主界面Tab(1)------ ViewPager实现Tab
    让TextView的drawableLeft与文本一起居中显示
    细说Java多线程之内存可见性
    八、图形与图像处理(2)
    65、TextView 字体设置不同颜色 --- 未完
    64、具有过渡动画效果的布局Layout( 2 )
    63、具有过渡动画效果的布局Layout
    62、常规控件(5)Navigation View –美观的侧滑视图
    61、常规控件(4)TabLayout-便捷实现标签
  • 原文地址:https://www.cnblogs.com/eaglesour/p/9494417.html
Copyright © 2011-2022 走看看