Spring Data JPA 使用QueryDSL

1 QueryDSL 是什么?

  • QueryDSL是基于ORM框架或SQL平台上的一个通用查询框架。借助QueryDSL可以在任何支持的ORM框架或SQL平台 上以通用API方式构建查询。

  • JPA是QueryDSL的主要集成技术,是JPQL和Criteria查询的代替方法。目前QueryDSL支持的平台包括 JPA,JDO,SQL,Mongodb 等等

  • Querydsl扩展能让我们以链式方式代码编写查询方法。该扩展需要一个接口QueryDslPredicateExecutor,它定义了很多查询方法。

2 Spring Data JPA 使用QueryDSL

1. 引入依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
    <dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.querydsl/querydsl-jpa -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.19</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>4.2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<!-- Spring不同模块或者与外部进行集成时,依赖处理就需要各自对应版本号。BOM是由Maven提供的功能,用以统一间接或者直接依赖的类库版本-->
<!-- 在maven的pom.xml中无需指定具体的类库版本,直接使用,即默认使用bom中指定的版本
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-bom</artifactId>
<version>2021.1.0</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!--该插件可以生成querysdl需要的查询对象(命名方式为:"Q"+对应实体名,执行mvn compile即可-->
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated‐sources/queries</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
<logOnlyOnError>true</logOnlyOnError>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

2 . 添加实体类和Jpa的配置

参考:[Spring data JPA的CRUD - 楼上有只喵 (pyr9.github.io)](https://pyr9.github.io/Spring data JPA的CRUD/)

3. 编写Repository

1
2
3
4
5
6
7
8
9
10
package org.pyr.repositories;

import org.pyr.entity.Customer;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface CustomerRepository extends CrudRepository<Customer, Long> , QuerydslPredicateExecutor<Customer> {
}

4 编写测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package org.pry;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.pyr.config.JPAConfig;
import org.pyr.entity.Customer;
import org.pyr.entity.QCustomer;
import org.pyr.repositories.CustomerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@ContextConfiguration(classes = JPAConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class QueryDslTest {
@Autowired
CustomerRepository customerRepository;

@Test
public void testFindOne() {
QCustomer qCustomer = QCustomer.customer;
Customer customer = customerRepository.findOne(
qCustomer.custId.eq(4L)
.and(qCustomer.custName.eq("aa"))
).orElse(null);
System.out.println(customer);
}
@Test
public void testFindAll() {
QCustomer qCustomer = QCustomer.customer;
Iterable<Customer> customers = customerRepository.findAll(
qCustomer.custId.in(4L, 5L, 6L, 7L)
.and(qCustomer.custName.eq("aa"))
);
System.out.println(customers);
}
}

Spring Data JPA 使用QueryDSL
http://example.com/Spring-Data-JPA-使用QueryDSL/
作者
Panyurou
发布于
2022年10月20日
许可协议