Java带有任意AND子句的动态Spring Data JPA存储库查询

我正在使用Spring data jpa repositories,要求提供具有不同字段的搜索功能。搜索之前输入的字段是optional.I有5场说EmployeeNumber,Name,Married,Profession和DateOfBirth

在这里我只需要查询用户给定的值,其他字段应该被忽略。

Input : EmployeeNumber: ,Name:St,Married: ,Professsion:IT,DateOfBirth: 

Query : Select * from Employee e where Name like 'St%' and Profession like 'IT%';

Input : EmployeeNumber:10,Name: ,Married: ,Professsion:IT,DateOfBirth:

Query : Select * from Employee e where EmployeeNumber like '10%' and Profession like 'IT%';

因此,这里我们考虑输入的值和进行查询。在这种情况下,Spring数据是具有限制中提到的这篇文章(不可扩展,所有可能出现的问题,应书面)我使用的Querydsl,但仍然存在问题的null领域应该被忽视,需要开发的几乎所有可能出现的问题。在这case 31 queries。如果搜索字段是6,7,8...

用可选字段实现搜索选项的最佳方法是什么?

回答:

请注意,使用新的主要版本的QueryDSL(4.x)和querydsl-jpa可能需要进行一些更改。

在我们的项目之一,我们用QueryDSLQueryDslPredicateExecutor<T>

  public Predicate createPredicate(DataEntity dataEntity) {

QDataEntity qDataEntity = QDataEntity.dataEntity;

BooleanBuilder booleanBuilder = new BooleanBuilder();

if (!StringUtils.isEmpty(dataEntity.getCnsiConsumerNo())) {

booleanBuilder

.or(qDataEntity.cnsiConsumerNo.contains(dataEntity.getCnsiConsumerNo()));

}

if (!StringUtils.isEmpty(dataEntity.getCnsiMeterNo())) {

booleanBuilder.or(qDataEntity.cnsiMeterNo.contains(dataEntity.getCnsiMeterNo()));

}

return booleanBuilder.getValue();

}

我们可以在存储库中使用它:

@Repository

public interface DataEntityRepository

extends DaoRepository<DataEntity, Long> {

哪里DaoRepository是

@NoRepositoryBean

public interface DaoRepository<T, K extends Serializable>

extends JpaRepository<T, K>,

QueryDslPredicateExecutor<T> {

}

因为这样,您可以使用存储库谓词方法。

Iterable<DataEntity> results = dataEntityRepository.findAll(dataEntityPredicateCreator.createPredicate(dataEntity));

要获取QClasses,您需要在pom.xml中指定QueryDSL APT Maven插件。

  <build>

<plugins>

<plugin>

<groupId>com.mysema.maven</groupId>

<artifactId>maven-apt-plugin</artifactId>

<version>1.0.4</version>

<executions>

<execution>

<phase>generate-sources</phase>

<goals>

<goal>process</goal>

</goals>

<configuration>

<outputDirectory>target/generated-sources</outputDirectory>

<processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>

</configuration>

</execution>

</executions>

</plugin>

依赖项是

    <!-- querydsl -->

<dependency>

<groupId>com.mysema.querydsl</groupId>

<artifactId>querydsl-core</artifactId>

<version>${querydsl.version}</version>

</dependency>

<dependency>

<groupId>com.mysema.querydsl</groupId>

<artifactId>querydsl-apt</artifactId>

<version>${querydsl.version}</version>

</dependency>

<dependency>

<groupId>com.mysema.querydsl</groupId>

<artifactId>querydsl-jpa</artifactId>

<version>${querydsl.version}</version>

</dependency>

或对于Gradle:

sourceSets {

generated

}

sourceSets.generated.java.srcDirs = ['src/main/generated']

configurations {

querydslapt

}

dependencies {

// other deps ....

compile "com.mysema.querydsl:querydsl-jpa:3.6.3"

compile "com.mysema.querydsl:querydsl-apt:3.6.3:jpa"

}

task generateQueryDSL(type: JavaCompile, group: 'build', description: 'Generates the QueryDSL query types') {

source = sourceSets.main.java

classpath = configurations.compile + configurations.querydslapt

options.compilerArgs = [

"-proc:only",

"-processor", "com.mysema.query.apt.jpa.JPAAnnotationProcessor"

]

destinationDir = sourceSets.generated.java.srcDirs.iterator().next()

}

compileJava {

dependsOn generateQueryDSL

source generateQueryDSL.destinationDir

}

compileGeneratedJava {

dependsOn generateQueryDSL

classpath += sourceSets.main.runtimeClasspath

}

以上是 Java带有任意AND子句的动态Spring Data JPA存储库查询 的全部内容, 来源链接: utcz.com/qa/416370.html

回到顶部