Querydsl与SpringBoot集成
Querydsl为大多数数据库提供了一种基于Java的类型安全,类SQL的查询方式。相比JPA,Querydsl能提供更加强大的查询方式,比如关联查询。相比MyBatis,Querydsl省去了XML文件或者注解SQL的麻烦,直接通过流式API的方式进行调用。
除了支持关系型数据库之外,Querydsl同样支持一下存储
- MongoDB
- Lucene
- Collections
- Spatial
- JDO
接下来通过H2+JPA的方式介绍Querydsl的基本使用(为了演示采用H2数据库)
一、创建项目,添加依赖
本文采用Spring Boot快速搭建项目,并在pom.xml中添加以下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>4.3.1</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.3.1</version>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
注意
当在项目中使用的是JPA的注解( javax.persistence.Entity)的时候,需要使用JPAAnnotationProcessor生成相关的查询类,如果使用的是Hibernate注解的时候,需要将JPAAnnotationProcessor替换成com.querydsl.apt.hibernate.HibernateAnnotationProcessor。
二、创建实体类
@Entity
public class User {
@Id
private Integer id;
private String name;
// 省略getter, setter等方法
}
@Entity
public class UserInfo {
@Id
private Integer userId;
private Integer sex;
}
实体类创建完成之后,重新编译项目
mvn clean package
在target/generated-sources/java目录中可以看到编译后生成的查询类(Q开头的类,例如QUser, QUserInfo)
三、测试
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class QuerydslTests {
@Autowired
private EntityManager entityManager;
private JPAQueryFactory queryFactory;
private QUser qUser;
private QUserInfo qUserInfo;
@BeforeEach
void setUp() {
queryFactory = new JPAQueryFactory(entityManager);
qUser = QUser.user;
qUserInfo = QUserInfo.userInfo;
}
@Test
void simpleQuery() {
User user = queryFactory.selectFrom(qUser)
.where(qUser.name.eq("XiaoMing"))
.fetchOne();
Assertions.assertNotNull(user);
Assertions.assertEquals("XiaoMing", user.getName());
}
@Test
void simpleQueryFields() {
String name = queryFactory.selectFrom(qUser)
.select(qUser.name)
.where(qUser.name.eq("XiaoMing"))
.fetchOne();
Assertions.assertNotNull(name);
Assertions.assertEquals("XiaoMing", name);
}
@Test
void join() {
Tuple tuple = queryFactory.selectFrom(qUser)
.select(qUser.id, qUser.name, qUserInfo.sex)
.innerJoin(qUserInfo).on(qUserInfo.userId.eq(qUser.id))
.where(qUser.name.eq("XiaoMing"))
.fetchOne();
Assertions.assertNotNull(tuple);
Assertions.assertNotEquals(0, tuple.size());
Integer userId = tuple.get(0, Integer.class);
String name = tuple.get(1, String.class);
Integer sex = tuple.get(2, Integer.class);
Assertions.assertEquals(1, userId);
Assertions.assertEquals("XiaoMing", name);
Assertions.assertEquals(0, sex);
}
}
最后附上数据库初始化脚本
insert into `user` (id, name) values (1, 'XiaoMing');
insert into `user` (id, name) values (2, 'XiaoHong');
insert into `user_info` (user_id, sex) values (1, 0);
insert into `user_info` (user_id, sex) values (2, 1);
Querydsl与SpringBoot集成的更多相关文章
- 【springBoot】springBoot集成redis的key,value序列化的相关问题
使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...
- SpringBoot集成security
本文就SpringBoot集成Security的使用步骤做出解释说明.
- springboot集成Actuator
Actuator监控端点,主要用来监控与管理. 原生端点主要分为三大类:应用配置类.度量指标类.操作控制类. 应用配置类:获取应用程序中加载的配置.环境变量.自动化配置报告等与SpringBoot应用 ...
- SpringBoot集成Shiro并用MongoDB做Session存储
之前项目鉴权一直使用的Shiro,那是在Spring MVC里面使用的比较多,而且都是用XML来配置,用Shiro来做权限控制相对比较简单而且成熟,而且我一直都把Shiro的session放在mong ...
- SpringBoot集成redis的key,value序列化的相关问题
使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...
- springboot集成mybatis(二)
上篇文章<springboot集成mybatis(一)>介绍了SpringBoot集成MyBatis注解版.本文还是使用上篇中的案例,咱们换个姿势来一遍^_^ 二.MyBatis配置版(X ...
- springboot集成mybatis(一)
MyBatis简介 MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyB ...
- springboot集成redis(mybatis、分布式session)
安装Redis请参考:<CentOS快速安装Redis> 一.springboot集成redis并实现DB与缓存同步 1.添加redis及数据库相关依赖(pom.xml) <depe ...
- SpringBoot集成jsp
一.springBoot集成jsp: 1.修改pom文件 <!--集成jsp所需jar包--> <!--jsp页面使用jstl标签--> <dependency> ...
随机推荐
- 基于 Spring Security 的前后端分离的权限控制系统
话不多说,入正题.一个简单的权限控制系统需要考虑的问题如下: 权限如何加载 权限匹配规则 登录 1. 引入maven依赖 1 <?xml version="1.0" enc ...
- [Azure DevOps] 编译时自动修改版本号
1. 需求 在使用 Pipeline 自动化 CI/CD 流程的过程中,我还还需要自动修改程序集的版本号.这个功能 EdiWang 和LeoLaw 都写文章讲解过做法.不过我的项目基本都是 .Net ...
- [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构
[源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构 目录 [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构 0x00 摘要 0x01 ...
- 为什么 Python 没有函数重载?如何用装饰器实现函数重载?
英文:https://arpitbhayani.me/blogs/function-overloading 作者:arprit 译者:豌豆花下猫("Python猫"公众号作者) 声 ...
- HashMap 中7种遍历方式的性能分析
随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从性能. ...
- 最佳实践丨使用Rancher轻松管理上万资源不是梦!
前 言 Rancher 作为一个开源的企业级 Kubernetes 集群管理平台.你可以导入现有集群,如 ACK.TKE.EKS.GKE,或者使用 RKE.RKE2.K3s 自定义部署集群. 作为业界 ...
- HTTP 5XX代码理解
500: 内部服务器错误,服务程序出现错误 501: 请求为完成,服务器不支持所请求功能,很少遇到 502: Bad Gateway,服务器从上游服务器收到一个无效响应, 一般就是nginx后端服 ...
- Pytest学习笔记10-生成html报告
前言 在pytest中,如何生成html测试报告呢,pytest提供了pytest-html插件,可以帮助我们生成测试报告,当然,如果希望生成更加精美的测试报告,我们还可以使用allure生成报告,下 ...
- C#Expression合集
一:总体概览 1:获取属性值: 2:调用方法 3:动态构造条件 4:创建对象 5:Switch Case 6:Try Catch 以及捕获异常信息并输出 7:if esle 8:+ / += 9: ...
- hdu 1754 I Hate It 线段树 单点更新 区间最值
线段树功能:update:单点更新 query:区间最值 #include <bits/stdc++.h> #define lson l, m, rt<<1 #define r ...