1. 目的
Querydsl可以少写SQL语句,还可以在持久域模型数据之上进行查询。那就与JPA整合试一试。
由于spring-boot支持kotlin和Java,那就把这两个方式都试一下。
2. 整合
2.1 准备工作
- Java 环境
- koltin
- Postgresql
- maven
2.2 添加maven 依赖
要想使用Querydsl需要使用如下两个相关依赖
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>5.0.0</version>
</dependency>
2.3 添加编译插件
2.3.1 Java
Java方式的配置比较简单,只需要根据官网介绍,添加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>${project.basedir}/target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
这样就可以通过maven的compile产生相对应的QXXX的文件。当然,前提是要在entity类上加上注解@Entity。
2.3.2 Kotlin
kotlin的插件就稍显麻烦了,各种坑也是比较多。主要如下:
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<configuration>
<args>
<arg>-Xjsr305=strict</arg>
</args>
<!--这个spring和jpa的插件必不可少,尤其是使用data class作entity的时候,不然首先是需要你在程序入口启动类上添加open属性,而且data class编译不会产生默认无参构造函数,即使加了no-args依赖也没用 -->
<compilerPlugins>
<plugin>spring</plugin>
<plugin>jpa</plugin>
</compilerPlugins>
</configuration>
<executions>
<execution>
<id>compile</id>
<!-- 这个phase必不可少,这里的compile阶段是处理源码,-->
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>kapt</id>
<!-- 这个phase必不可少,这里的阶段是产生Q类,-->
<phase>generate-sources</phase>
<goals>
<goal>kapt</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>src/main/kotlin</sourceDir>
</sourceDirs>
<annotationProcessorPaths>
<annotationProcessorPath>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
<!--这个jpa也比不可少 -->
<classifier>jpa</classifier>
</annotationProcessorPath>
</annotationProcessorPaths>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-noarg</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</plugin>
2.4 使用
这里以kotlin代码为例,展示最简单的使用方法。深入过程待深入学习。
Entity类
import javax.persistence.Column
import javax.persistence.Entity
import javax.persistence.Id
import javax.persistence.Table
@Entity
@Table(name = "phone")
data class PhoneEntity(
@Id
@Column(name="id")
val id: String,
@Column(name = "name")
val name: String,
@Column (name="brand")
val brand: String
)
Repository
import com.example.querydslkotlin.dao.entity.PhoneEntity
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.querydsl.QuerydslPredicateExecutor
interface PhoneRepository: JpaRepository<PhoneEntity, String>, QuerydslPredicateExecutor<PhoneEntity>
Service中使用
import com.example.querydslkotlin.dao.entity.PhoneEntity
import com.example.querydslkotlin.dao.entity.QPhoneEntity
import com.example.querydslkotlin.dao.repository.PhoneRepository
import com.querydsl.core.BooleanBuilder
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import java.util.*
@Service
class PhoneService @Autowired constructor(
private val phoneRepository: PhoneRepository
){
fun getPhone(criteria: String) :Optional<PhoneEntity> {
val predicate = BooleanBuilder()
predicate.and(QPhoneEntity.phoneEntity.name.eq(criteria))
return phoneRepository.findOne(predicate)
}
}
这样就可以通过查询到数据。
querydsl更强大的动态查询等等,后续探讨。