1.概念介紹
1.Query是Hibernate的查詢接口,用於從數據存儲源查詢對象及控制執行查詢的過程,Query包裝了一個HQL查詢語句。
2.HQL是Hibernate Query Language的簡寫,HQL查詢在涵蓋Criteria查詢的所有功能的前提下,提供了類似標准SQL語句的查詢方式,更加面向對象的封裝,更加靈活,因此Hibernate將HQL查詢方式立為官方推薦的標准查詢方式
它的書寫形式和sql幾乎一樣,下面就來體會下
2.單表查詢
針對一個表的查詢, from A , hibernate會把A翻譯為對相應的實體
2.1獲取對象的所有屬性:
String hql="from User u where u.userID=?"
它的的返回形式是一個user對象
2.2獲取對象的一個屬性:
String hql="select u.name from User u where u.userID = ?";
它的返回形式是: List<String> users, 屬性是String類型, 因此List的泛型,會自動封裝為屬性的類型
2.3獲取部分屬性,返回對象
第一步: 在User實體中,添加構造函數
public User(Integer age, String name) {}
第二步: 寫hql
String hql = "select new User ( u.name,u.age ) from User u where u.userID > ?";
通過new的方式,可以達到目的,它的返回形式是: List<User> users
3.關聯表查詢: 關聯的是id
下面是one2one和one2many的例子
3.1 One2One
user和order是一對一的關系,User實體類中有屬性 Order order
以User的id為條件查
String hql="from User u left join u.order o where u.id>?";
1.left join u.order , 沒有on 關鍵字, sql 翻譯自動為關聯u.xxx left out join o.id
2.with關鍵字 相當於sql中的on
3.它的返回形式是:List<Object[]> 對象數組的集合, 每一個數組有兩個元素,即 object[]{user,order}
以Order的id為條件查
String hql="from User u where u.order.id>?";
u.order.id 是hibernate關聯對象間的導航特性
現在我需求是, 既然order是User的一個屬性, 我想把Order封裝在User中,即object[]{user}
hql的變化有三點: select u ; 加入fetch 關鍵字; 為了防止有重復數據,加入disrinct關鍵字
String hql="select distinct u from User u left join fetch u.orders where u.id>?";
它的返回形式是:List<Object[]> 對象數組的集合, 數組的數據機構是 : object[]{user},通過getOrders()獲取關聯的對象
distinct和fecch有這么神奇的效果,看了下面的分析,肯定明白
查詢出的數據如下,只展示id,其余數據省略
UserId | OrderID | |
1 | 1 | |
1 | 2 |
對上面的數據它是如何封裝的呢?
1>第一行數據 : 用戶id為1 第一步: User user = new User();存取用戶信息。 第二步: Order order1=new Order(),存取order信息,並將order1, user.setOrders(...) 第三部: 將user存入List<User> users, users.add(user) 2>第二行數據 : 用戶id依然為1 第一步: 發現用戶id未改變,,則繼續使用user. 第二步: 訂單id改變,則 Order order2 = new Order(),存取order信息,並將order2存入user. 這個時候,同一個user擁有的兩個order 第三步: 將user存入List<User> users, users.add(user1); 3>最終: List<User> users;
3.2 one2many
user和order是一對多的關系,User實體類中有屬性 Set<Order> orders
Ordre實體中有關系屬性: User user
以orders的id為條件去查
String hql="from User u left join u.orders o where o.id>?";
注意:
必須left join u.orders,這是顯示連接 orders , 這是和one2one不同之處
4.關聯表查詢: 關聯的是普通屬性
A表中有xx字段, B表中也有xx字段
string hql = "select a from A a ,B b where a.xx=b.xx";
5.子查詢
Order中的屬性: Long userId , 是 User的 邏輯外鍵
String hql="from User u where u.id >"
+ "(select o.userId from Order o where o.id =1)";
子查詢必須放在where關鍵字后面,必須用()括起來
原因: from字句中的實體對象,必須在Hibernate配置文件中有明確的配置