将JINQ与JPA和H2一起使用
幾天前,我讀了Iu Ming-Yee關于JINQ的有趣采訪 。 顧名思義,JINQ是一種嘗試提供類似于LINQ for Java的嘗試。 基本思想是縮小在關系數據模型上執行查詢的面向對象代碼之間的語義鴻溝。 關系數據庫模型的查詢應輕松集成到代碼中,以使其感覺更自然。
LINQ背后的研究得出的結論是,將代碼轉換為關系數據庫查詢的算法最適合功能代碼。 當Java 8附帶流API時,作者使用它來實現Java博士學位的想法。
為了弄清我們的手,我們從一個簡單的項目開始,該項目使用Hibernate over JPA以及H2數據庫和JINQ:
<dependencies><dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId><version>${jee.version}</version><scope>provided</scope></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>${h2.version}</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>${hibernate.version}</version></dependency><dependency><groupId>org.jinq</groupId><artifactId>jinq-jpa</artifactId><version>1.8.10</version></dependency> </dependencies>為了使用JINQ流,我們必須創建一個將EntityManagerFactory作為參數的提供程序:
EntityManagerFactory factory = Persistence.createEntityManagerFactory("PersistenceUnit"); JinqJPAStreamProvider streams = new JinqJPAStreamProvider(factory);將一些人插入我們的數據庫后,我們可以輕松地查詢他們:
List<String> firstNames = streams.streamAll(entityManager, Person.class).map(Person::getFirstName).collect(toList()); firstNames.forEach(System.out::println);使用先前創建的JinqJPAStreamProvider streamAll()方法,我們可以訪問數據庫中的所有人員。 在這個簡單的例子中,我們只想輸出每個人的名字; 因此,我們map列表并將所有結果collect到List 。 使用forEach()方法和對println()方法的引用來打印此列表。
看一下生成的SQL代碼,我們看到選擇了所有列:
selectperson0_.id as id1_4_,person0_.FIRST_NAME as FIRST_NA2_4_,person0_.ID_CARD_ID as ID_CARD_4_4_,person0_.LAST_NAME as LAST_NAM3_4_, fromT_PERSON person0_當然,我們可以使用select()方法來優化語句:
List<String> firstNames = streams.streamAll(entityManager, Person.class).select(Person::getFirstName).where(p -> p.equals("Homer")).collect(toList()); firstNames.forEach(System.out::println);此外,我們還添加了一個謂詞( where firstName = 'Homer' ):
selectperson0_.FIRST_NAME as FIRST_NA2_4_ fromT_PERSON person0_ whereperson0_.FIRST_NAME='Homer'留下這個簡單的示例,我們現在要創建一個查詢,以選擇在時間和物質項目中工作的所有具有“ Christian”名字的怪胎:
List<String> geeks = streams.streamAll(entityManager, Project.class).where(p -> p.getProjectType() == Project.ProjectType.TIME_AND_MATERIAL).joinList(Project::getGeeks).where(g -> g.getTwo().getFirstName().equals("Christian")).map(p -> p.getTwo().getFirstName()).collect(toList()); geeks.forEach(System.out::println);從上面的代碼可以看出,我們使用第一個where()子句來選擇所有時間和材料項目。 joinList()調用連接了怪胎表,而隨后的where()子句還限制為僅選擇名字為“ Christian”的怪胎。 等等,這就是創建的SQL查詢:
selectgeek2_.FIRST_NAME as col_0_0_ fromT_PROJECT project0_ inner joinT_GEEK_PROJECT geeks1_ on project0_.id=geeks1_.PROJECT_ID inner joinT_GEEK geek2_ on geeks1_.GEEK_ID=geek2_.id whereproject0_.projectType='TIME_AND_MATERIAL'and geek2_.FIRST_NAME='Christian' limit ?結束語 :前一段時間使用JPA的標準API,我必須說,使用JINQ的第一步更直觀,更容易寫下。 通過使用Java 8中的流,JINQ確實有助于縮小關系數據庫世界之間的鴻溝。
翻譯自: https://www.javacodegeeks.com/2016/04/using-jinq-jpa-h2.html
總結
以上是生活随笔為你收集整理的将JINQ与JPA和H2一起使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea资源包下创建资源包_资源包技巧和
- 下一篇: 马斯克狂喜!特斯拉大涨10% 市值一夜暴