前言
querydsl是一个可以构建查询语句的java框架,它可以很方便的和jpa结合在一起使用,大大的简化了jpa语句的编写,再配合spring-data-jpa,大部分场景下都不需要编写hql语句了。本文将介绍如何在spring-boot中配合spring-data-jpa来使用querydsl
简单示例
你需要先添加依赖:
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<scope>provided</scope>
</dependency>
当然前提是必须先添加 spring-boot、spring-data-jpa等的依赖并配置好数据库。
你还需要添加下面的maven 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,lombok.launch.AnnotationProcessorHider$AnnotationProcessor
</processor>
</configuration>
</execution>
</executions>
</plugin>
依赖添加完成后,你就可以使用querydsql了,下面将介绍几种使用方式:
在Repository中使用
public interface ArchiveRepository extends PagingAndSortingRepository<Archive, Integer>, QuerydslPredicateExecutor<Archive> {
//...
}
上面的示例代码是我自己一个项目的Repository文件,可以看到其实现了QuerydslPredicateExecutor接口。
通过查看源码发现其有多个方法:
从截图中可以看到有一个Predicate类,这个Predicat类就是查询对象了,如果你有使用过mybatis-generator,那么这个Predicate是和Example类功能类似,你可以构建一个Predicate类,将其传入findAll方法,findAll方法还支持排序、分页等重载方法。
下面是我构建Predicate类的示例:
QArchive a = new QArchive("archive");
return archiveRepository.exists(a.site.id.eq(site.getId())
.and(a.businessDate.eq(date)).and(a.language.eq(lan)));
有人肯定已经注意到了,凭空多出来一个 QArchive类,这个类其实就是querydal自己生成的一个Predicate类,通过这个类,你可以通过dsl的方式来生成查询条件(Predicate)类。
自动将前端参数转为Predicate对象
可以在Spring的controller上面增加Predicate参数,这样spring会自动将请求参数里与字段名同名的参数生成为一个Predicate对象,知识这样生成的查询条件将会是最简单的 and 和 equals逻辑。
文章评论