Hibernate之檢索方式

來源:互聯網
上載者:User

標籤:com   彙總   order   方法   擷取   構造方法   ble   .com   begin   

 

時間:2017-1-22 16:09

 

——檢索方式

Hibernate中提供了以下幾種檢索對象的方式:
    *   導航對象圖檢索方式
        根據已經載入額對象導航到其他對象。
        >   Customer customer = (Customer)session.get(Customer.class, 1)
            customer.getOrders(); // 得到客戶的訂單

    *   OID檢索方式
        按照對象的OID來檢索對象。
        >   get() / load()

    *   HQL檢索方式
        使用物件導向的HQL查詢語言。
        >   Query query = session.createQuery(String HQL)

    *   QBC檢索方式
        使用QBC API來檢索對象,這種API封裝了基於字串形式的查詢語句,提供了更加物件導向的查詢介面。
        >   Criteria criteria = session.createCriteria(Customer.class)

    *   本地SQL檢索方式
        使用本機資料庫的SQL查詢語句。
        >   SQLQuery quer = session.createSQLQuery(String sql)

——HQL

1、HQL(Hibernate Query Language)是物件導向的查詢語言,它和SQL查詢語言有些相似,在Hibernate提供的各種檢索方式中,HQL是使用最廣泛的一種檢索方式,它有如下功能:
    *   在查詢語句中設定各種查詢條件
    *   支援投影查詢,即僅檢索出對象的部分屬性
    *   支援分頁查詢
    *   支援串連(多表)查詢
    *   支援分組查詢,允許使用HAVING和GROUP BY關鍵字
    *   提供內建函數,如SUM(),MIN(),MAX()
    *   能夠調用使用者自訂的SQL函數或標準的SQL函數
    *   支援子查詢
    *   支援動態綁定參數

2、HQL檢索方式包括以下步驟
    *   通過Session的createQuery()方法建立一個Query對象,它包括一個HQL查詢語句,HQL查詢語句中可以包含具名引數。
    *   動態綁定參數
    *   調用Query的list()方法執行查詢語句,該方法返回java.util.List類型的查詢結果,在List集合中存放了複合查詢條件的持久化對象。

3、Query介面支援方法調用鏈編程風格,它的setXxx()方法返回自身執行個體,而不是void類型

4、HQL和SQL的區別
    1)HQL查詢語句是物件導向的,Hibernate負責解析HQL查詢語句,然後根據對象 - 關係對應檔中的映射資訊,把HQL查詢語句翻譯成相應的SQL語句,HQL查詢語句中的主體是領域模型中的類及類的屬性。
    2)SQL查詢語句是與關係型資料庫綁定在一起的,SQL查詢語句中的主體是資料庫表及表的欄位。

範例程式碼:
    1)使用HQL查詢所有資料
        // 使用HQL查詢全部客戶資訊

        // Query query = session.createQuery("from Customer");        // List<Customer> list = query.list();        // print(list);


    2)使用別名進行查詢
        // 使用別名查詢

        // List<Customer> list = session.createQuery("from Customer as c").list();        // print(list);         // 使用別名查詢:條件查詢,as關鍵字可以省略        // 不支援select * from 表的文法,但是可以使用:select 別名 from 表 as 別名        Query query = session.createQuery("from Customer as c where c.cname = ?");        // query.setString(0, "張三");        // 除了setString(),也可以setParameter()        query.setParameter(0, "張三");        List<Customer> list = query.list();        print(list);

    3)多態查詢
        會將設定檔中實現了指定類的全部子類都進行查詢。
        Query query = session.createQuery("from java.lang.Object");        print(query.list());

    4)對查詢結果進行排序
        List<Customer> list = session.createQuery("from Customer as c order by c.id desc").list();        print(list); 

    5)分頁查詢
        // 使用HQL進行分頁查詢        Query query = session.createQuery("from Order");        query.setFirstResult(0);        query.setMaxResults(11);        List<Order> list = query.list();        print(list);

    6)查詢單個記錄
        // 使用HQL查詢單個記錄        Query query = session.createQuery("from Customer where cname = ?");        query.setString(0, "李四");        // 當結果超過1條時,uniqueResult()方法會報錯        Customer customer = (Customer) query.uniqueResult();        System.out.println(customer);

    7)投影查詢
        /*         * 只查詢客戶的名稱         * 如果只查詢一個屬性,返回的是String         * 如果查詢多個屬性,返回的是一個Object數組         */        // Query query = session.createQuery("select c.cid, c.cname from Customer as c");        // 查詢一個屬性時,返回字串        // List<String> = query.list();        // 查詢多個屬性時返回數組        // List<Object[]> list = query.list();        /*         * 將查詢記錄封裝到對象中         * 為實體類提供一個對應參數的構造方法
         * public Customer(Integer cid, String cname){ ... }          */        Query query = session.createQuery("select new Customer(cid, cname) from Customer");        List<Customer> list = query.list();        print(list);

    8)綁定參數,進行條件查詢
        // 使用?方式綁定參數        Query query = session.createQuery("from Customer where cname = ?");        query.setParameter(0, "李四");        List<Customer> list = query.list();        print(list);

        // 多個參數
        Query query = session.createQuery("from Customer where cname = ? and cid = ?");        query.setParameter(0, "李四");        query.setParameter(1, 2);        List<Customer> list = query.list();        print(list);

        // 使用名稱方式綁定參數        Query query = session.createQuery("from Customer where cname = :name and cid = :id");        query.setParameter("name", "李四");        query.setParameter("id", 2);        List<Customer> list = query.list();        print(list);

        // 綁定實體參數        Customer customer = new Customer();        customer.setCid(1);        Query query = session.createQuery("from Order as o where o.customer = ?");        query.setEntity(0, customer);        List<Order> list = query.list();        print(list);

    9)模糊查詢
        // 使用HQL進行模糊查詢        Query query = session.createQuery("from Customer where cname like ?");        query.setParameter(0, "李%");        List<Customer> list = query.list();        print(list);

    10)彙總函式
        // 使用彙總函式查詢        Query query = session.createQuery("select count(*) from Order");        List<Order> list = query.list();        print(list); 


——QBC

QBC運算子:

    


範例程式碼:
    1)使用QBC查詢所有資料
        // 使用QBC的方式查詢所有客戶資訊

        // Criteria criteria = session.createCriteria(Customer.class);        // print(criteria.list());


    2)對查詢結果進行排序

        Criteria criteria = session.createCriteria(Customer.class).addOrder(org.hibernate.criterion.Order.desc("id"));        print(criteria.list());

    3)分頁查詢
        // 使用QBC進行分頁查詢        Criteria criteria = session.createCriteria(Order.class);        criteria.setFirstResult(0);        criteria.setMaxResults(11);        List<Order> list = criteria.list();        print(list);

    4)查詢單個記錄
        // 使用QBC查詢單個記錄        Criteria criteria = session.createCriteria(Customer.class);        // 設定條件        criteria.add(Restrictions.eq("cname", "李四"));        // 只查詢第一條記錄        criteria.setMaxResults(1);        Customer customer = (Customer) criteria.uniqueResult();        System.out.println(customer);

    5)條件查詢
        // 綁定一個參數        Criteria criteria = session.createCriteria(Customer.class);        criteria.add(Restrictions.eq("cname", "李四"));
        // 綁定多個參數
        criteria.add(Restrictions.eq("cid", "2"));         List<Customer> list = criteria.list();        print(list);

    6)模糊查詢
        // 使用QBC進行模糊查詢        Criteria criteria = session.createCriteria(Customer.class);        criteria.add(Restrictions.like("cname", "李%"));        List<Customer> list = criteria.list();        print(list);


——SQL

範例程式碼:
    1)使用SQL查詢所有資料

        // 使用SQL語句查詢全部客戶資訊        SQLQuery query = session.createSQLQuery("select * from Customer");         List<Object[]> list = query.list();        printArr(list);     2)使用SQL查詢所有資料,並將資料封裝到實體物件中
        // 使用SQL查詢全部客戶資訊,並將結果記錄封裝到實體物件中        SQLQuery query = session.createSQLQuery("select * from Customer");        List<Customer> list = query.addEntity(Customer.class).list();        print(list);



——多表查詢

1、普通多表查詢
    1)交叉串連
        select * from A,B;
        得到的是笛卡爾積。

    2)內串連
        查詢的是兩個表的交集
            select * from A inner join B on A.欄位 = B.欄位;

        隱式內串連:
            select * from A, B where A.欄位 = B.欄位

    3)外串連
        左外串連
            select * from A left outer join B on A.欄位 = B.欄位
        右外串連
            select * from A right outer join B on A.欄位 = B.欄位

2、在HQL中的多表查詢
    1)交叉串連
    2)內串連
    3)隱式內串連
    4)迫切內串連
    5)左外串連
    6)迫切左外串連
    7)右外串連

3、範例程式碼
    1)內串連
        /*

         * HQL內串連查詢         * 查詢的是兩個表的交集部分         */        Query query = session.createQuery("from Customer as c inner join c.orders");        List list = query.list();        printArr(list);


    2)迫切內串連
        // 迫切內串連,使用一個關鍵字fetch

        // 如果使用from Customer as c inner join fetch c.orders,則會出現重複的Customer        // 可以使用distinct關鍵字去除重複的Customer:select distinct c         Query query = session.createQuery("select distinct c from Customer as c  inner join fetch c.orders");        List list = query.list();        print(list);


4、左外串連與迫切左外串連的用法與內串連、迫切內串連相同

5、HQL的內串連與迫切內串連的區別:
    內串連查詢:
        將資料封裝到List<Object[]>中。
    迫切內串連:
        將資料封裝到一個List<Customer>中,但是迫切內串連會得到重複的記錄,需要使用distinct去重。

——離線條件查詢

現在有這麼一個表單,可以根據不同的查詢條件進行不同的查詢操作,但是DAO層無法擷取Web層的對象,可以使用離線對象進行操作。

傳統方式:
    UserService user = new UserService();
    user.findByCondition(username, sex, edu, tel);
    這樣做的局限性在於無法修改上傳的內容,不方便擴充。

離線方式:
    獲得一個離線的Criteria,在Web層將Criteria對象的條件設定好。
        criteria.add(Restrictions.eq("name", "張三"));
        criteria.add(Restrictions.eq("sex", "男"));

    然後在Web層調用service方法傳入Criteria對象,在DAO層擷取可執行檔離線Criteria對象。

範例程式碼:

    /*     * 離線條件查詢     */    public void fun15(){        Session session = HibernateUtils.openSession();        Transaction tx = session.beginTransaction();         // 在Web層建立離線對象        DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class);        // 設定參數        criteria.add(Restrictions.eq("cname", "李四"));        criteria.add(Restrictions.eq("cid", 2));

          // 在DAO層獲得可執行檔Criteria對象        Criteria criteria2 = criteria.getExecutableCriteria(session);        List<Customer> list = criteria2.list();         print(list);         tx.commit();        session.close();    }


——總結

1、對象導航方式
    *   可以通過一個對象獲得到關聯對象。

2、根據OID進行檢索
    *   get()
    *   load();

3、HQL
    *   session.createQuery(String hql);
    *   簡單查詢:from Customer
    *   排序:from Customer c order by c.cid desc;
    *   條件查詢:位置綁定參數(?),名稱綁定參數(:name)
    *   分頁查詢:query.setFirstResult(int from); query.setMaxResult(int max)
    *   彙總函式:select count(*) from Customer group by cid;
    *   多態查詢:from java.lang.Object
    *   投影查詢:select cid, cname from Customer
    *   構造方法將查詢結果封裝成對象:select new Customer(cid, cname) from Customer
    *   多表查詢
        >   交叉串連
        >   內串連
        >   迫切內串連
        >   左外串連
        >   迫切左外串連
    *   命名查詢

4、QBC
    *   session.createCriteria(Class class);
    *   簡單查詢
    *   排序查詢
    *   條件查詢:criteria.add(Restrictions(name, value));
    *   分頁查詢
    *   離線條件查詢

5、SQL
    *   session.createSQLQuery(String sql);

    

Hibernate之檢索方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.