Hibernate的批量查询

Posted Qiao_Zhi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate的批量查询相关的知识,希望对你有一定的参考价值。

 Hibernate的查询大致分为以下三种场景,

  1.  HQL查询-hibernate Query Language(多表查询,但不复杂时使用)

     2.  Criteria查询(单表条件查询)

  3.  原生SQL查询(复杂的业务查询)

 

接下来解释三种使用方法: 

 1.HQL查询-hibernate Query Language(多表查询,但不复杂时使用)  Hibernate独家查询语言,属于面向对象的查询语言

   注意:HQL语言中不会出现SQL中的表和列,HQL使用的都是JavaBean的类名和属性名。

1.HQL基本查询

(1)查询所有的基本语句

    @Test
    // HQL查询所有数据
    public void fun1() {
        // 1 获得session
        Session session = HibernateUtil.openSession();
        // 2.书写HQL语句
        String hql = "from cn.qlq.domain.Customer";// from 类名全路径
        // 3.根据hql创建查询对象
        Query query = session.createQuery(hql);
        // 4.根据查询对象获取查询结果
        List<Customer> customers = query.list();
        System.out.println(customers);
    }

 

结果:

Hibernate: 
    select
        customer0_.cust_id as cust_id1_0_,
        customer0_.cust_name as cust_nam2_0_,
        customer0_.cust_source as cust_sou3_0_,
        customer0_.cust_industry as cust_ind4_0_,
        customer0_.cust_level as cust_lev5_0_,
        customer0_.cust_linkman as cust_lin6_0_,
        customer0_.cust_phone as cust_pho7_0_,
        customer0_.cust_mobile as cust_mob8_0_ 
    from
        cst_customer customer0_
[Customer [cust_id=1, cust_name=XXXXXXXXXX], Customer [cust_id=2, cust_name=联想]]

 

 

改进:如果整个项目中只有一个类的名字可以省略包路径,也就是可以只写类名:

    @Test
    // HQL查询所有数据
    public void fun1() {
        // 1 获得session
        Session session = HibernateUtil.openSession();
        // 2.书写HQL语句
//        String hql = "from cn.qlq.domain.Customer";// from 类名全路径
        String hql = "from Customer";// 如果整个项目中只有这一个类名可以直接写名字
        // 3.根据hql创建查询对象
        Query query = session.createQuery(hql);
        // 4.根据查询对象获取查询结果
        List<Customer> customers = query.list();
        System.out.println(customers);
    }

 

 

(2)根据主键查询单个

    @Test
    // HQL查询单个数据
    public void fun2() {
        // 1 获得session
        Session session = HibernateUtil.openSession();
        // 2.书写HQL语句
//        String hql = "from cn.qlq.domain.Customer";// from 类名全路径
        String hql = "from Customer where cust_id = 1";// where后面是Customer的属性名称而不是列名
        // 3.根据hql创建查询对象
        Query query = session.createQuery(hql);
        // 4.根据查询对象获取查询结果
        Customer customer = (Customer) query.uniqueResult();
        System.out.println(customer);
    }

 

 

 2.HQL条件查询:

 (1)?占位符查询

  类似于JDBC的占位符,只是hibernate的?下标从0开始,而JDBC的下标从1开始,基本上所有的编程索引都从0开始,唯独JDBC从1开始。。。。

    @Test
    // HQL的?占位符查询
    public void fun3() {
        // 1 获得session
        Session session = HibernateUtil.openSession();
        // 2.书写HQL语句
//        String hql = "from cn.qlq.domain.Customer";// from 类名全路径
        String hql = "from Customer where cust_id = ?";// 如果整个项目中只有这一个类名可以直接写名字
        // 3.根据hql创建查询对象
        Query query = session.createQuery(hql);
//        query.setLong(0, 1l);//类似于JDBC的占位符,只是JDBC的占位符下标从0开始,hibernate从1开始
        query.setParameter(0, 1l);//这种写法不用管类型
        // 4.根据查询对象获取查询结果
        Customer customer = (Customer) query.uniqueResult();
        System.out.println(customer);
    }

 

 

 

 (2)命令占位符   :name格式的查询,固定格式,name随便起,习惯性的起做和条件名字一样

    @Test
    // HQL的命令占位符查询
    public void fun4() {
        // 1 获得session
        Session session = HibernateUtil.openSession();
        // 2.书写HQL语句
//        String hql = "from cn.qlq.domain.Customer";// from 类名全路径
        String hql = "from Customer where cust_id = :cust_id";// :cust_id的名字随便起,只不过习惯性的起做一样
        // 3.根据hql创建查询对象
        Query query = session.createQuery(hql);
//        query.setLong(0, 1l);//类似于JDBC的占位符,只是JDBC的占位符下标从0开始,hibernate从1开始
        query.setParameter("cust_id",1l);
        // 4.根据查询对象获取查询结果
        Customer customer = (Customer) query.uniqueResult();
        System.out.println(customer);
    }

 

 

 

3.HQL分页查询

   分页查询类似于mysql的limit关键字,limit start,pageSize。。。。。。

    @Test
    // HQL分页查询
    public void fun5() {
        // 1 获得session
        Session session = HibernateUtil.openSession();
        // 2.书写HQL语句
//        String hql = "from cn.qlq.domain.Customer";// from 类名全路径
        String hql = "from Customer";// :cust_id的名字随便起,只不过习惯性的起做一样
        // 3.根据hql创建查询对象
        Query query = session.createQuery(hql);
        /**
         * 类似于 limit start,pageSize;
         * 假设页大小是2
         * 页号 起始值  页大小
         * 1   0    2
         * 2   2    2
         */
        //例如取第二页数据
        query.setFirstResult(2);
        query.setMaxResults(2);
        // 4.根据查询对象获取查询结果
         List<Customer> customers = query.list();
        System.out.println(customers);
    }

 

结果:

Hibernate: 
    select
        customer0_.cust_id as cust_id1_0_,
        customer0_.cust_name as cust_nam2_0_,
        customer0_.cust_source as cust_sou3_0_,
        customer0_.cust_industry as cust_ind4_0_,
        customer0_.cust_level as cust_lev5_0_,
        customer0_.cust_linkman as cust_lin6_0_,
        customer0_.cust_phone as cust_pho7_0_,
        customer0_.cust_mobile as cust_mob8_0_ 
    from
        cst_customer customer0_ limit ?,
        ?
[Customer [cust_id=3, cust_name=博客园], Customer [cust_id=4, cust_name=仍然]]

 

 

 

2.Criteria查询(单表条件查询)

 

以上是关于Hibernate的批量查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 HQL 查询的 Hibernate 批量更新

Hibernate批量处理数据HQL连接查询

Hibernate批量处理数据HQL连接查询

在 Hibernate 中批量删除时查询语法错误

Hibernate的批量查询——原生sql查询

Hibernate的批量查询——Criteria