擴展Hibernate以處理Java流查詢

2020-12-15 離開了編程我會死

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。

相關焦點

  • Java 面試如何坐等 offer?
    4.final 在 java 中有什麼作用?5.java 中的 Math.round(-1.5) 等於多少?6.String 屬於基礎的數據類型嗎?7.java 中操作字符串都有哪些類?它們之間有什麼區別?
  • 動力節點Java學院2021年Java學習路線圖最新出爐啦
    重點學習:面向對象,集合、IO流、線程、並發、異常及網絡編程等等第二階段:資料庫重點學習:SQL精講、MySQL、oracle、MySQL索引實現原理及優化、JDBC這一部分學完可以通過SQL語言從資料庫中查詢數據,結合Java項目實現動態站點數據的保存。第三階段:WEB前端
  • 如何優雅的設計 Java 異常
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫導語異常處理是程序開發中必不可少操作之一,但如何正確優雅的對異常進行處理確是一門學問
  • java之列印流,printStream的簡單介紹
    各位小夥伴們大家好,在之前的文章中小編介紹了序列化與反序列化的相關知識,這次小編要介紹的是列印流的一些概念還有使用,具體如下:java.io.PrintStream:列印流PrintStream為其他輸出流添加了功能,使它們能夠方便地列印各種數據值和表示形式
  • JDK/JAVA 13正式版發布
    此版本帶來了以下幾大新特性:JEP 350,Dynamic CDS Archives:擴展應用程式類-數據共享,以允許在Java應用程式執行結束時動態歸檔類。歸檔類將包括默認的基礎層CDS(class data-sharing)存檔中不存在的所有已加載的應用程式類和庫類。
  • Redkale 1.9.5 發布,Java 分布式微服務
    Redkale有自己的DataSource,你不用再糾結用hibernate還是mybatis,更不用寫SQL。Redkale有自己的CacheSource,你不用再糾結用memcache還是redis,更不用糾結用redisson還是jredis實現方式。
  • Java基礎面試題簡單總結
    另一種情況就是JAVA允許程式設計師擴展這種語義檢查,程式設計師可以創建自己的異常,並自由選擇在何時用throw關鍵字引發異常。所有的異常都是java.lang.Thowable的子類。43、垃圾回收的優點和原理。
  • JAVA基礎學習|JAVA中的包總結!
    4.java.net包。  該包提供實現網絡應用與開發的類。  5.java.sql包。  該包提供了使用Java語言訪問並處理存儲在數據源(通常是一個關係型資料庫)中的數據API。  6.java.awt包
  • Joda-Time v2.0 發布,Java的日期時間處理
    Joda-Time提供了一組Java類包用於處理包括ISO8601標準在內的date和time。可以利用它把JDK Date和Calendar類完全替換掉,而且仍然能夠提供很好的集成。
  • Java基礎學習:一篇文章讓你搞懂Java字符串的前世今生
    可以看到,其實並沒有真正的【拼接】操作發生,從源碼編譯為字節碼時,javac 就已經把 "a" 和 "b" 串在一起了,這是一種編譯期的優化處理例2final String x ="b";String s ="a"+ x;常量池
  • Java applet 安全性探究
    【IT168專稿】引言  因為一個0day,讓作者對java applet心血來潮,隨著不斷的失敗,發現了一個又一個安全特性。本文提醒大家,除了activeX,還有這麼一種東西,一旦出現了安全隱患,也會幫大家做些什麼。
  • Java之 Scanner類
    CheckingAccount.java 文件代碼:// 文件名稱 CheckingAccount.javaimport java.io.常見編譯異常有:IOException(流傳輸異常),SQLException(資料庫操作異常)等。3、java處理異常的機制:拋出異常以及捕獲異常 ,一個方法所能捕捉的異常,一定是Java代碼在某處所拋出的異常。簡單地說,異常總是先被拋出,後被捕捉的。
  • 一文帶你入門Java Stream流,太強了
    單從「Stream」這個單詞上來看,它似乎和 java.io 包下的 InputStream 和 OutputStream 有些關係。實際上呢,沒毛關係。Java 8 新增的 Stream 是為了解放程式設計師操作集合(Collection)時的生產力,之所以能解放,很大一部分原因可以歸功於同時出現的 Lambda 表達式——極大的提高了編程效率和程序可讀性。
  • 傳智播客:Java學科API的概述以及Scanner的操作
    所以我們可以通過查詢API的方式,來獲得Java提供的類的學習方法,並學會如何使用它們。API使用步驟:打開幫助的文檔點擊顯現,找到索引,看到輸入框我們要找誰就在輸入框裡面輸入,然後回車就可以了看包,java.lang下的類不需要導包
  • 跟我學java編程—Java的Scanner類
    Scanner類的初始化聲明一個scanner變量,並用new運算符實例化Scanner,實例化Scanner時,需要傳入System.in對象,Scanner通過傳入的System.in獲取用戶輸入,並對用戶輸入的字符進行處理,屏蔽了獲取用戶輸入的複雜操作。
  • 好程式設計師Java培訓分享Java讀寫Properties配置文件
    2.Properties中的主要方法 (1)load(InputStream inStream) 這個方法可以從.properties屬性文件對應的文件輸入流中
  • JAVA應用可視化診斷工具
    相當於可視化的jstat命令監控區域有PS Eden SpacePS Survivor SpacePS Old SpaceMetaspaceCode CacheCompressed Class Space2.線程監控:相當於可視化的jstack命令JHSDB:基於服務性代理的調試工具(java9
  • 你必須掌握的 21 個 Java 核心技術!
    >java程序涉及到的各個路徑(classpath, java。異常框架異常在java的開發中可能沒有那麼被重視,異常處理的最佳實戰詳細說明了。一般遇到異常,直接上拋,或者隨便catch一下處理之後對於程序整體運行也沒有什麼大的影響。不過在企業級設計開發中, 異常的設計與處理的好壞,往往就關係著這個系統整體的健壯性。
  • 為Java應用程式實現分布式資料庫
    支持水平擴展SQL查詢支持透明的集群級事務支持複雜的事件處理(CEP)和簡單的流式SQL節點不需要啟動任何其他協調器分布式持久模式所有節點都將使用特定的消息(事件)來提供節點間數據一致性和水平擴展查詢。