1. 程式人生 > >Hibernate的批量查詢

Hibernate的批量查詢

public rst 單個 try 類名 session first color 根據

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的批量查詢