2.1 Query類介紹
順便說一句,另一個重要的點是Query helper 類。你可以在這個例子中看到它:
public List<Employee> getAllEmployes() {
try (Session session = sessionFactory.openSession()) {
Query<Employee> query = session.createQuery("from Employee", Employee.class);
return query.list();
}
}
事實上,Query 是一個接口,它針對不同的情況有多種實現。但為簡單起見,我將繼續稱其為類。比方說,就 OOP 而言,這是廣義上的類。
筆記。曾經有兩個類:
- 查詢描述查詢。
- TypedQuery描述具有已知類型的查詢。
第一個出現在 Hibernate 已經存在並且還沒有泛型的時候。然後,在 JDK 5 發布後,Hibernate 又增加了一個類——TypedQuery,它已經支持查詢結果的類型化。
但是,據我所知,從 Hibernate 第 5 版開始,只剩下一個類型類,現在稱為 Query。
創建查詢的標準方法是:
Query<Employee> query = session.createQuery("from Employee", Employee.class);
您學習瞭如何創建 Query 對象,但是如何執行這些查詢呢?
這裡更簡單——我們只需調用Query 對象的list()方法:
Query<Employee> query = session.createQuery("from Employee", Employee.class);
List<Employee> resultLіst = query.list();
list()方法有一個 JPA 同義詞,一種做同樣事情但稱為getResultList()的方法。有時您可以在其他程序員編寫的代碼中看到它。
順便說一句,如果查詢暗示結果將在單個結果中,那麼使用uniqueResult()方法調用查詢會更容易。
Query<Employee> query = session.createQuery("from Employee where id = 1", Employee.class);
Employee result = query.uniqueResult();
uniqueResult()方法有一個 JPA 同義詞,即singleResult()方法。它是為了 Hibernate 與 JPA 標準的兼容性而引入的。他做同樣的事情。
2.2 查詢類方法
事實上,Query 類有很多不同的方法。下面我再說其中的三個。
第一個是stream()方法。及其 JPA 同義詞getResultStream()。
這兩種方法都返回數據流而不是列表。當您不需要一次獲得作為查詢結果的所有對象時,這種方法會非常有效。或者有可能只使用其中的第一個。
例子:
Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
Stream<Employee> stream = query.stream();
第二種方法是executeUpdate()方法。您可以編寫一個查詢來更改數據庫中的某些內容。在這種情況下,Hibernate 在訪問數據庫時不使用只讀事務是必要的。
請求示例:我們決定將所有用戶的級別提高 1。
Query<User> query = session.createQuery("update User set level=level+1", User.class);
int count = query.executeUpdate();
executeUpdate()方法將返回實際已修改的行數。
最後第三種方法是scroll()。我們會告訴你更多關於它的信息。
2.3 滾動類方法
這個方法有點類似於stream()方法。只有它允許您在結果列表中移動而根本不拉出結果。也就是說,您可以執行一個查詢,然後將其滾動到結果的第百萬行並從那裡開始讀取數據。
如此高級的迭代器。
Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
ScrollableResults對象具有以下方法:
方法 | 描述 |
---|---|
獲取() | 返回當前元素 |
下一個() | 將指針移動到下一個元素 |
以前的() | 將指針移動到上一個元素 |
滾動(整數大小) | 按大小行向前滾動 |
位置(int pos) | 使元素位置號成為當前元素 |
最後的() | 當前元素現在是最後一個 |
第一的() | 當前元素現在是第一個 |
獲取行號() | 返回當前行號 |
設置行號() | 設置當前行號 |
假設您運行了一個查詢並且想要獲取最後一個元素。方法如下:
Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
scroll.last();
Employee lastEmployee = scroll.get();
GO TO FULL VERSION