我正在使用Spring data jpa repositories,要求提供具有不同字段的搜索功能。搜索之前输入的字段是optional.I有5场说EmployeeNumber,Name,Married,Profession和DateOfBirth。 在这里我只需要查询用户给定的值,其他字段应该被忽略。
Spring data jpa repositories
optional.I
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
case 31 queries
6,7,8...
用可选字段实现搜索选项的最佳方法是什么?
请注意,使用新的主要版本的QueryDSL(4.x)和querydsl-jpa可能需要进行一些更改。
在我们的项目之一,我们用QueryDSL用QueryDslPredicateExecutor<T>。
QueryDSL
QueryDslPredicateExecutor<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 }