介紹
傳統上,獲取大量資料可能會導致記憶體資源緊張,因為它通常涉及將整個結果集載入記憶體。
=>流查詢方法透過提供一種使用 Java 8 Streams 增量處理資料的方法來提供解決方案。這可確保任何時候只有一部分資料保存在記憶體中,增強效能和可擴充性。
在這篇文章中,我們將深入研究流查詢方法在 Spring Data JPA 中的工作原理,探索它們的用例,並演示它們的實作。
對於本指南,我們使用:
- IDE:IntelliJ IDEA(建議用於 Spring 應用程式)或 Eclipse
- Java 版本:17
- Spring Data JPA 版本:2.7.x 或更高版本(與 Spring Boot 3.x 相容)
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-jpa</artifactid> </dependency>
注意:有關更詳細的範例,請訪問我的 GitHub 儲存庫
1.什麼是流查詢方式?
Spring Data JPA 中的流查詢方法允許我們以 Stream 的形式傳回查詢結果,而不是 List 或其他集合類型。這種方法有幾個好處:
高效率的資源管理:增量處理數據,減少記憶體開銷。
延遲處理:隨選取得和處理結果,非常適合分頁或批次等場景。
與函數式程式設計整合:串流符合 Java 的函數式程式設計特性,支援過濾、映射和收集等操作。
2.如何使用流查詢方法?
=>假設我們正在開發一個電子商務應用程式並希望:
- 檢索所有在特定日期之後下訂單的客戶。
- 過濾總金額高於特定提供金額的訂單。
- 以過去 6 個月內的訂單總價值將客戶分組。
- 傳回資料作為客戶名稱及其總訂單價值的摘要。
實體
- 客戶:代表客戶。
@Setter @Getter @Entity @Entity(name = "tbl_customer") public class Customer { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<order> orders; } </order>
- 訂單:代表客戶下的訂單。
@Setter @Getter @Entity(name = "tbl_order") public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Double amount; private LocalDateTime orderDate; @ManyToOne @JoinColumn(name = "customer_id") private Customer customer; }
儲存庫
-
CustomerRepository 用於選擇客戶及其在特定日期之後下的相關訂單。我們使用 Stream
而不是清單處理查詢結果。
public interface CustomerRepository extends JpaRepository<customer long> { @Query(""" SELECT c FROM tbl_customer c JOIN FETCH c.orders o WHERE o.orderDate >= :startDate """) @QueryHints( @QueryHint(name = AvailableHints.HINT_FETCH_SIZE, value = "25") ) Stream<customer> findCustomerWithOrders(@Param("startDate") LocalDateTime startDate); } </customer></customer>
注意:
JOIN FETCH 確保訂單被急切地載入。
@QueryHints 用於向 JPA(例如 Hibernate)提供額外提示以最佳化查詢執行。
=>例如,當我的查詢傳回 100 筆記錄時:
- 前 25 筆記錄由應用程式取得並處理。
- 處理完畢後,將取得接下來的 25 筆記錄,依此類推,直到處理完所有 100 筆記錄。
- 此行為最大限度地減少了記憶體使用量,並避免一次將所有 100 筆記錄載入到記憶體中。
服務
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-jpa</artifactid> </dependency>
這裡是處理資料的服務類,有兩個參數startDate和minOrderAmount。如您所見,我們不使用 sql 查詢進行過濾,而是將所有資料作為流加載,然後透過 Java 程式碼進行過濾和分組。
控制器
@Setter @Getter @Entity @Entity(name = "tbl_customer") public class Customer { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<order> orders; } </order>
檢定
=>要建立測試數據,您可以在我的原始程式碼中執行以下腳本或自行新增。
src/main/resources/dummy-data.sql
請求:
- 開始日期: 2024-05-01T00:00:00
- 最小訂單金額:100
@Setter @Getter @Entity(name = "tbl_order") public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Double amount; private LocalDateTime orderDate; @ManyToOne @JoinColumn(name = "customer_id") private Customer customer; }
回應:
- 傳回總金額等於或大於 minOrderAmount 的所有客戶。
public interface CustomerRepository extends JpaRepository<customer long> { @Query(""" SELECT c FROM tbl_customer c JOIN FETCH c.orders o WHERE o.orderDate >= :startDate """) @QueryHints( @QueryHint(name = AvailableHints.HINT_FETCH_SIZE, value = "25") ) Stream<customer> findCustomerWithOrders(@Param("startDate") LocalDateTime startDate); } </customer></customer>
3. 流與列表
=>您可以使用 IntelliJ Profiler 來監視記憶體使用量和執行時間。有關如何添加和測試大數據集的更多詳細信息,您可以在我的 GitHub 存儲庫中找到
小資料集:(10 個客戶,100 個訂單)
- 流:執行時間(~5ms),記憶體使用(低)
- 清單:執行時間(~4ms),記憶體使用(低)
大型資料集(10.000 個客戶,100.000 個訂單)
- 流:執行時間(~202ms),記憶體使用(中)
- 清單:執行時間(~176ms),記憶體使用(高)
效能指標
Metric | Stream | List |
---|---|---|
Initial Fetch Time | Slightly slower (due to lazy loading) | Faster (all at once) |
Memory Consumption | Low (incremental processing) | High (entire dataset in memory) |
Memory Consumption | Low (incremental processing) | High (entire dataset in memory) |
Processing Overhead | Efficient for large datasets | May cause memory issues for large datasets |
Batch Fetching | Supported (with fetch size) | Not applicable |
Error Recovery | Graceful with early termination | Limited, as data is preloaded |
總結
Spring Data JPA 流查詢方法提供了一種優雅的方式來高效處理大型資料集,同時利用 Java Streams 的強大功能。透過增量處理數據,它們減少了記憶體消耗並與現代函數式程式設計範例無縫整合。
您對流查詢方法有何看法?在下面的評論中分享您的經驗和用例!
下一篇文章見。快樂編碼!
以上是Spring Data JPA 流查詢方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載
最受歡迎的的開源編輯器