您需要使用QueryDSL。
第 1 步:将com.mysema.querydsl:querydsl-apt、com.mysema.querydsl:querydsl-core 和com.mysema.querydsl:querydsl-jpa 依赖项添加到您的项目中。
第 2 步:将 @QueryEntity 注释添加到您希望在其上运行动态查询的实体类。如果查询将包含嵌套类,请将注释添加到嵌套实体类中。下面是一个例子:
@Entity
@QueryEntity
@Table(name = "users")
public class User {
@OneToMany
private Address address;
}
@Entity
@QueryEntity
@Table(name = "address")
public class Address {
@ManyToOne
private Country country;
}
@Entity
@QueryEntity
@Table(name = "country")
public class Country { }
第 3 步:在process 阶段运行com.mysema.maven:apt-maven-plugin Maven 插件,如下所示:
<build>
<plugins>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.1</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.mysema.query.apt.QuerydslAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
第 4 步:更改 Spring Data JPA 存储库接口以扩展 QueryDslPredicateExecutor。
interface UserRepository extends JpaRepository<User, Long>, QueryDslPredicateExecutor<User> {}
通过此设置,APT 插件将为每个带有 QueryEntity 注释的类生成 Q 类。然后,您可以使用这些类生成动态查询。例如:
QUser user = QUser.user;
BooleanExpression query = and(eq(user.active, Boolean.TRUE), eq(user.address.country.name, "Belgium"));
Collection<User> activeUsersFromBelgium = userRepository.findAll(query);