hibernate -- hql查詢


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配置文件中有明確的配置

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM