Hibernate(四) - HQL_QBC查詢詳解--抓取策略優化機制
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查詢詳解--抓取策略優化機制