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集成的更多相关文章

  1. 【springBoot】springBoot集成redis的key,value序列化的相关问题

    使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...

  2. SpringBoot集成security

    本文就SpringBoot集成Security的使用步骤做出解释说明.

  3. springboot集成Actuator

    Actuator监控端点,主要用来监控与管理. 原生端点主要分为三大类:应用配置类.度量指标类.操作控制类. 应用配置类:获取应用程序中加载的配置.环境变量.自动化配置报告等与SpringBoot应用 ...

  4. SpringBoot集成Shiro并用MongoDB做Session存储

    之前项目鉴权一直使用的Shiro,那是在Spring MVC里面使用的比较多,而且都是用XML来配置,用Shiro来做权限控制相对比较简单而且成熟,而且我一直都把Shiro的session放在mong ...

  5. SpringBoot集成redis的key,value序列化的相关问题

    使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...

  6. springboot集成mybatis(二)

    上篇文章<springboot集成mybatis(一)>介绍了SpringBoot集成MyBatis注解版.本文还是使用上篇中的案例,咱们换个姿势来一遍^_^ 二.MyBatis配置版(X ...

  7. springboot集成mybatis(一)

    MyBatis简介 MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyB ...

  8. springboot集成redis(mybatis、分布式session)

    安装Redis请参考:<CentOS快速安装Redis> 一.springboot集成redis并实现DB与缓存同步 1.添加redis及数据库相关依赖(pom.xml) <depe ...

  9. SpringBoot集成jsp

    一.springBoot集成jsp: 1.修改pom文件 <!--集成jsp所需jar包--> <!--jsp页面使用jstl标签--> <dependency> ...

随机推荐

  1. 大厂面试必问!HashMap 怎样解决hash冲突?

    HashMap冲突解决方法比较考验一个开发者解决问题的能力. 下文给出HashMap冲突的解决方法以及原理分析,无论是在面试问答或者实际使用中,应该都会有所帮助. 在Java编程语言中,最基本的结构就 ...

  2. Jenkins用户权限管理-Role-based Authorization Strategy插件

    02-Jenkins用户权限管理-Role-based Authorization Strategy插件 在jenkins的使用过程中,需要给用户分配只管理特定项目的权限来保证项目相关人员只能管理对应 ...

  3. .Net Core:限流

    一.环境 1.vs2019 2..Net Core 3.1 3.引用 AspNetCoreRateLimit 4.0.1 二.基础使用 1.设置 在Startup文件中配置如下,把配置项都放在前面: ...

  4. 使用 Docker 秒速搭建多版本 PHP 开发环境

    目录 目标 下载 代理设置 配置环境 PHP 7.2.x,占用本地端口 8081 PHP 5.6.x,占用本地端口 8082 端口映射 local.php72.com -> 127.0.0.1: ...

  5. 《面试八股文》之kafka21卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是moon,最新一篇面试八股文系 ...

  6. python之struct详解

    python之struct详解 2018-05-23 18:20:29 醉小义 阅读数 20115更多 分类专栏: python   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议 ...

  7. nginx反向代理tcp协议的80端口

    需求:内网有一台mqtt协议服务器,需要将外网的mqtt请求通过一台服务器代理到内网的mqtt服务器上.而这台代理服务器不会开放出了80之外的端口,所以只能使用80端口来转发mqtt请求. 步骤:1. ...

  8. nacos服务注册,ClientWorker狂刷日志的问题

    日志,启动项目就疯狂的刷ClientWorker日志 配置 本身项目中配置的依赖 nacos-discovery,nacos-config版本都是2021.1,但是编译版本是1.4.1 升级nacos ...

  9. java.util.Date 与 java.sql.Date

    java.sql.Date 继承 java.util.Date 区别: 1.java.sql.Date 一般用于数据库 2.java.sql.Date 没有时分秒,涉及时分秒的函数都会报异常(且这些方 ...

  10. ctf Decode

    这题其实没啥好说的,就是直接解,听学长说好像网上有现成的轮子可以用,我太年轻了,手动写了个decode函数. 也成功得到了flag.嘿嘿开心