QueryDsl整合spring-data-jpa

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更强大的动态查询等等,后续探讨。

3.代码

kotlin工程
Java工程

猜你喜欢

转载自blog.csdn.net/Apple_wolf/article/details/125957846