標籤: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之檢索方式