Java 8中發布的Java Stream API已被證明是一種表達應用程式邏輯的高效、簡潔而直觀的方法。新啟動的開源項目JPAstreamer允許您使用Java Streams表示Hibernate或其他JPA資料庫查詢。在本文中,我們將向您展示如何擴展現有資料庫應用程式的API以即時處理Stream查詢。
為了讓您快速了解JPAstreamer的功能,我們首先向您展示一個在包含任意用戶(屬性包括名字和姓氏)的資料庫表上運行Stream的示例:
這將列印十個用戶,這些用戶的名字以字母A開頭,字母A根據用戶的姓氏反向排列。這說明了如何將所需結果集輕鬆描述為Stream運算符的管道。
從表面上看,似乎提供的Stream需要在JVM中實現User表中的每一行,實際上對Stream進行了優化並呈現給JPA查詢。因此,Stream查詢的性能與JPQL或Criteria Builder等替代方法一樣,但是JPAstreamer構成了一種簡化的,類型安全的表達查詢的方法。
JPAstreamer如何工作
JPAstreamer在您的Maven / Gradle構建中添加了單個依賴項,從而將其插入您的應用程式。
像著名的Java庫Lombok一樣,JPAstreamer使用注釋處理器在編譯時形成元模型。它檢查標記有標準JPA批註@Entity的所有類,並為每個實體Foo.class生成一個對應的Foo $ .class。生成的類將實體屬性表示為欄位,這些欄位用於形成User $ .firstName.startsWith(「 A」)形式的謂詞,JPAstreamer的查詢優化器可以解釋這些謂詞。
重要的是,JPAstreamer不會更改或幹擾現有的代碼庫,而只是擴展API來處理Java Stream查詢。此外,元模型放置在「目標」文件夾中的「生成的源」中,無需使用原始碼進行檢入或測試。
流處理
現在,我們將引導您完成在資料庫應用程式中設置JPAstreamer的簡單過程。為此,您的應用程式必須使用Java 8(或更高版本)和Hibernate或負責對象持久性的其他JPA提供程序(如果您希望在不使用JPA的情況下使用Stream API,最好使用開源的Stream ORM Speedment)。
如前所述,僅需要向您的Maven / Gradle構建中添加一個依賴項,並重新構建應用程式以生成JPAstreamer元模型。
完成簡單的設置後,您需要像這樣獲得JPAStreamer的實例:
您應該將字符串「 db-name」替換為您要查詢的持久性單元的名稱。在您的JPA配置文件(通常稱為persistence.xml)中的標籤<persistence-unit>下進行查找。
JPAstreamer實例提供對方法.stream()的訪問,該方法接受您要流式傳輸的實體的名稱。要查詢用戶表,只需鍵入:
這將返回類型為Stream <User>的所有用戶行的流。有了Stream源,您可以隨意添加任何Java Stream操作來形成數據流經的管道(數據流是概念性的圖像,而不是代碼執行方式的實際描述)。例如:
該流收集列表中20歲以下用戶的姓名。User $是指生成的實體,它是JPAstreamer的元模型的一部分。該實體用於為操作(例如.filter()和.sort()) 形成謂詞和比較器,這些操作可以利用現代IDE中的代碼完成功能迅速組成。
這是另一個例子,該示例使用組合謂詞計算來自德國並被命名為「奧託」的所有用戶:
結論
在本文中,我們展示了如何將開源庫JPAstreamer與Hibernate(或任何JPA提供程序)集成在一起,以構成類型安全和可表達的資料庫查詢作為標準Java Streams。