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();