Вы можете использовать QueryDSL для динамической генерации любых запросов в вашем хранилище на основе полей вашей сущности.
Чтобы интегрировать его с Spring Data JPA, добавьте в проект следующие две зависимости и процессор аннотаций JPA:
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>4.1.4</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.1.4</version>
</dependency>
<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>target/generated-sources/java</outputDirectory>
<processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
… и расширьте свой репозиторий таким образом:
public interface EmployeeRepository extends JpaRepository<EmployeeEntity, Long>,
QuerydslPredicateExecutor<EmployeeEntity>, QuerydslBinderCustomizer<QEmployeeEntity> {
}
Теперь вы можете выражать все виды комбинаций запросов:
BooleanExpression name = QEmployeeEntity.employeeEntity.last_name.eq("brawn");
BooleanExpression stateAndName = QEmployeeEntity.employeeEntity.state.eq("tx").and(name);
Обратитесь также к справочному руководству JPA Spring Data для получения дополнительной информации.