1. 程式人生 > >Hibernate(四) - HQL_QBC查詢詳解--抓取策略優化機制

Hibernate(四) - HQL_QBC查詢詳解--抓取策略優化機制

load i++ lec for 簡單的 測試類 domain 字符 main.c

Hibernate 的查詢方式

  在 Hibernate 中提供了很多種的查詢的方式。Hibernate 共提供了五種查詢方式。

1、Hibernate 的查詢方式:OID 查詢

  OID檢索:Hibernate根據對象的OID(主鍵)進行檢索。

  ① 使用 get 方法

Customer customer = session.get(Customer.class,1l);

  ② 使用 load 方法

Customer customer = session.load(Customer.class,1l);

2、Hibernate 的查詢方式:對象導航檢索

  對象導航檢索:Hibernate根據一個已經查詢到的對象,獲得其關聯的對象的一種查詢方式。

LinkMan linkMan = session.get(LinkMan.class,1l);
Customer customer  = linkMan.getCustomer();

Customer customer = session.get(Customer.class,2l);
Set<LinkMan> linkMans = customer.getLinkMans();

3、Hibernate 的查詢方式:HQL 檢索

  HQL查詢:Hibernate Query Language,Hibernate的查詢語言,是一種面向對象的方式的查詢語言,語法類似SQL。通過session.createQuery(),用於接收一個HQL進行查詢方式。

  在進行 HQL 查詢之前,先做一些準備。首先,新建一個 Java 項目,在項目裏面新建一個文件夾,命名為 lib,並將上一個項目用到的包復制過來,添加的構建路徑中去 。把工具類和配置文件拷貝過來。

  ① 初始化數據

package com.itheima.hibernate.demo1;

import java.util.Arrays;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.itheima.hibernate.domain.Customer; import com.itheima.hibernate.domain.LinkMan; import com.itheima.hibernate.utils.HibernateUtils; /** * HQL的查詢方式的測試類 * * @author jt * */ public class HibernateDemo1 { @Test /** * 初始化數據 */ public void demo1() { Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); // 創建一個客戶 Customer customer = new Customer(); customer.setCust_name("李向文"); for (int i = 1; i <= 10; i++) { LinkMan linkMan = new LinkMan(); linkMan.setLkm_name("王東" + i); linkMan.setCustomer(customer); customer.getLinkMans().add(linkMan); session.save(linkMan); } session.save(customer); tx.commit(); }

  3.1、HQL 的簡單查詢

    /**
     * HQL的簡單查詢
     */
    public void demo2() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        // 簡單的查詢
     // 返回一個 Query 的接口,而且支持鏈式寫法
        Query query = session.createQuery("from Customer");
        List<Customer> list = query.list();

        // sql中支持*號的寫法:select * from cst_customer; 但是在HQL中不支持*號的寫法。
        /*
         * Query query = session.createQuery("select * from Customer");// 報錯
         * List<Customer> list = query.list();
         */


        // 再打印的時候,會默認調用對象的 toString(),兩邊不要都 toString(),都設置的話,其實就是一個死循環 
        // 為什麽呢?因為你客戶裏面有聯系人的集合,它需要把聯系人給打印了;聯系人那邊呢,又有客戶;客戶又有聯系人...
        // 這樣的話就是一個死循環,所以在 toString() 的時候,把集合先去掉;打印先不打印集合,只是單純的去看客戶的一些數據

        // 這裏一定需要註意,除了客戶的打印,像你 JSON 的轉換,兩邊互相與對象的時候,JSON 一轉換,它也是一個死循環。
        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }    

  需要註意的是“from customer”這裏是一個對象,正常的寫法應該是帶包名的;但是在映射裏面已經配置的包了,所以這個地方可以省略。一定要註意 ,這個地方是類名,而不是你的表名。

  3.2、HQL 的別名查詢

    @Test
    /**
     * 別名查詢
     */
    public void demo3() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        // 別名的查詢
        /*
         * Query query = session.createQuery("from Customer c"); List<Customer>
         * list = query.list();
         */

        // 支持.屬性的寫法,但是需要註意的是 ,這種方式得到的 list 裏面放的就不是一個對象了
        Query query = session.createQuery("select c from Customer c");
        List<Customer> list = query.list();

        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }

  3.3、HQL 的排序查詢

  它跟 SQL 語句很類似的,所以再做排序查詢的時候跟 SQ L也是很相似的。

  裏面也可以使用 order by,後面跟的是類裏面的屬性名,默認情況下就是升序的。

    @Test
    /**
     * 排序查詢
     */
    public void demo4() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        // 排序的查詢
        // 默認情況
        // List<Customer> list = session.createQuery("from Customer order by
        // cust_id").list();
        // 設置降序排序 升序使用asc 降序使用desc
        List<Customer> list = session.createQuery("from Customer order by cust_id desc").list();

        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }

  3.4、HQL 的條件查詢

  支持兩種條件查詢的方式,

    @Test
    /**
     * 條件查詢
     */
    public void demo5() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        // 條件的查詢
        // 一、按位置綁定:根據參數的位置進行綁定。
        // 一個條件
        /*
         * Query query = session.createQuery("from Customer where cust_name = ?"
         * ); query.setParameter(0, "李兵"); List<Customer> list = query.list();
         */

        // 多個條件
        /*
         * Query query = session.createQuery(
         * "from Customer where cust_source = ? and cust_name like ?");
         * query.setParameter(0, "小廣告"); query.setParameter(1, "李%");
         * List<Customer> list = query.list();
         */

        // 二、按名稱綁定,名稱隨便起
        Query query = session.createQuery("from Customer where cust_source = :aaa and cust_name like :bbb");
        // 設置參數:
        query.setParameter("aaa", "朋友推薦");
        query.setParameter("bbb", "李%");
        List<Customer> list = query.list();

        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }

  3.5、HQL 的投影查詢

  投影查詢:查詢對象的某個或某些屬性。

    @Test
    /**
     * 投影查詢
     */
    public void demo6() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();

        // 投影查詢
        // 單個屬性,封裝的是對象
// 返回一個 list,但裏面裝的是一個字符串類型的值。Object 可以強轉稱字符串
/* * List<Object> list = session.createQuery( * "select c.cust_name from Customer c").list(); for (Object object : * list) { System.out.println(object); } */ // 多個屬性,封裝的是對象的數組
// list 集合裏面放置的是一個 Object 數組,不同類型的值要想通用,只能放到一個數組之中
/* * List<Object[]> list = session.createQuery( * "select c.cust_name,c.cust_source from Customer c").list(); for * (Object[] objects : list) { * System.out.println(Arrays.toString(objects)); } */ // 查詢多個屬性,但是我想封裝到對象中。 List<Customer> list = session.createQuery("select new Customer(cust_name,cust_source) from Customer").list(); for (Customer customer : list) { System.out.println(customer); } tx.commit(); }

4、Hibernate 的查詢方式:QBC 檢索

5、Hibernate 的查詢方式:SQL 檢索

Hibernate(四) - HQL_QBC查詢詳解--抓取策略優化機制