将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一起使用相关推荐
- java jinq_将JINQ与JPA和H2一起使用
java jinq 几天前,我读了Iu Ming-Yee对JINQ的有趣采访 . 顾名思义,JINQ是一种尝试提供类似于LINQ for Java的尝试. 基本思想是缩小在关系数据模型上执行查询的面向 ...
- 使用Spring Rest和Spring Data JPA和H2以及Spring Boot示例的Restful API
你好朋友, 在本教程中,您将学习以下内容: 1.在Spring Boot中配置Spring Rest,Spring Data JPA和H2 2.使用Spring Boot创建Springful服务端点 ...
- Spring Boot + Bootstrap + FreeMarker分页 (JPA, Liquibase, H2)
1. 引言 在本文中,我们将介绍基于Spring Boot JPA.Bootstrap 和FreeMarker的分页组件.将数据库结果划分为页是许多应用程序中常用的功能.本教程将介绍如何使用FreeM ...
- JPA H2内存数据库 demo
本文基于SpringBoot工程,引用的依赖包有thymeleaf.springmvc.jpa.h2.mysql,考虑篇幅,有些代码省略. 1.使用JPA需继承CrudRepository接口 继承C ...
- springboot整合jpa+h2
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. JPA的主要目标之一 ...
- spring_通过Spring Boot了解H2 InMemory数据库
spring 介绍 基本上,数据库设置涉及几个步骤,然后才能在应用程序中通过已配置的数据源使用它. 实际上,这在实际项目实施中是必需的. 但是,在某些情况下,我们只需要为某件事完成POC,并且整个数据 ...
- inmemory_通过Spring Boot了解H2 InMemory数据库
inmemory 介绍 基本上,数据库设置涉及几个步骤,然后才能在应用程序中通过已配置的数据源使用它. 在实际项目实施中,这实际上是必需的. 但是,在某些情况下,我们只需要为某件事完成POC,并且整个 ...
- 通过Spring Boot了解H2 InMemory数据库
介绍 基本上,数据库设置涉及几个步骤,然后才能在应用程序中通过已配置的数据源使用它. 在实际项目实施中,这实际上是必需的. 但是,在某些情况下,我们只需要为某些事情完成POC,而整个数据库设置工作仍然 ...
- springboot整合H2内存数据库,实现单元测试与数据库无关性
springboot整合H2内存数据库,实现单元测试与数据库无关性 一.新建spring boot工程 新建工程的时候,需要加入JPA,H2依赖 二.工程结构 pom文件依赖如下: [html] vi ...
最新文章
- python 进程间通信效率_Python进程间通信 multiProcessing Queue队列实现详解
- js Date.parse()兼容性问题
- Vue.js 表单输入绑定
- vscode怎么运行verilog语言_VScode中不同语言使用不同字体,如C/C++,VHDL
- 为ASP.NET控件加入快捷菜单
- get和post混合提交
- linux shell 脚本使用
- [例程]string.trim().length()的用法
- XMind 8 Update 7 激活
- 掌握到胃-奈氏图与伯德图的绘制
- Zookeeper kick off
- Quartu编写D触发器
- css里面设置一个背景边框图片或者填充一张图片,使图片填充整个div容器;
- Android 上的SSH软件 connectbot
- Note For Linux By Jes(8)-Linux 账号管理与ACL权限控制
- 「镁客·请讲」bitBerg杨坤:冰山下藏着的是VR游戏的未来
- oracle的form开发,Oracle Form开发之调用Form
- 欧姆龙, PLC CJ2M标准程序,一共控制12个伺服电机 ,气缸若干,包含轴点动,回零
- 属于未来计算机的睡哪一个,【单选题】下面哪一个不是未来计算机的发展方向?
A. 光计算机
B. 量子计算机
C. 电子管计算机
D. 神经网络计算机...
- 矮人DOS工具箱4.2安装及使用图解(ppt)