Spring 使用 Spring 数据剩余启动动态查询
Spring Boot Dynamic Querying With Spring Data Rest
我正在尝试做一些有趣的事情,我希望能够使用 Spring Boot 1.5.9 和 Spring Data Rest 动态构建 sql 查询过滤器而不需要写一个控制器。我觉得我可能走在正确的道路上,但我有点卡住了。
思路是通过HandlerInterceptorAdapter拦截HTTP Request GET方法,并将Request查询参数存储到一个对象中,供PagingAndSortingRepository使用。计划是覆盖 findAll(Pageable p),Spring Data Rest 默认使用,调用 findAll(Specification s, Pageable p) 允许动态过滤。
我已经使用 Spring 提供的 Request Scope 来保存查询参数,以允许我在请求的整个生命周期中使用它们。
问题是我无法从 Repository 接口文件访问 QueryParam 对象。我尝试按照这个 Whosebug 解决方案将依赖项注入到接口文件中,但它不起作用:Spring Dependency injection for interfaces
Spring Data Rest 尝试通过尝试基于函数名称构建 SQL 查询来创建端点。即使我试图通过创建一个可以查询的函数来欺骗 Spring Data 来解决这个问题,然后用我在下面实现的 SampleRepositoryComponents 覆盖它,我也无法获取存储在 QueryParam 中的数据。
其他人也提出了请求以允许 Spring Data Rest 忽略某些方法:https://github.com/spring-projects/spring-data-rest/pull/286
查询参数:
public class QueryParam {
String query_string;
Map<String, String[]> parameter_map;
public String getQuery_string() {
return query_string;
}
public void setQuery_string(String query_string) {
this.query_string = query_string;
}
public Map<String, String[]> getParameter_map() {
return parameter_map;
}
public void setParameter_map(Map<String, String[]> parameter_map) {
this.parameter_map = parameter_map;
}
}
示例存储库:
@RepositoryRestResource(collectionResourceRel = "Sample", path = "Sample")
public interface SampleRepository extends PagingAndSortingRepository<Sample, UUID>,
JpaSpecificationExecutor<Sample> {
// Cannot just use any custom name
@RestResource(exported = false)
public QueryParam getQuery_param();
default public Page<Sample> findAll(Pageable p) {
QuerySpecification<Sample> qs = new QuerySpecification<Sample>(getQuery_param());
return findAll(qs, p);
}
}
查询规范:
public class QuerySpecification<T> implements Specification<T> {
private QueryParam query_param;
public QuerySpecification(QueryParam query_param) {
this.query_param = query_param;
};
@Override
public Predicate toPredicate(Root<T> rt, CriteriaQuery<?> cq, CriteriaBuilder cb) {
// Build your custom predicate here
return null;
}
}
示例存储库组件:
@Component
public abstract class SampleRepositoryComponents implements SampleRepository {
@Autowired
private QueryParam query_param;
@Override
public QueryParam getQuery_param() {
return this.query_param;
}
public void setQuery_param(QueryParam query_param) {
this.query_param = query_param;
}
}
在 Querydsl and Web support Spring 数据扩展的帮助下,'from the box' 在 Spring 数据 REST 中实现了同样的功能。
只需从 QuerydslPredicateExecutor<MyEntity>
扩展您的回购协议(以及可选的 QuerydslBinderCustomizer<QMyEntity>
,默认实现 customize
方法,就像示例 here 中那样),然后您可以查询您的带过滤的 repo 数据(更多其他 - 支持分页和排序):
/myEntities?field1=value1&field2=value2&sort=field2,desc&size=10&page=2
不要忘记将 QueryDSL 依赖项添加到您的项目中(例如这样):
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<scope>provided</scope>
</dependency>
<build>
<plugins>
<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/annotations</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
然后编译你的项目(例如mvn compile
)让它'Q'类.
我正在尝试做一些有趣的事情,我希望能够使用 Spring Boot 1.5.9 和 Spring Data Rest 动态构建 sql 查询过滤器而不需要写一个控制器。我觉得我可能走在正确的道路上,但我有点卡住了。
思路是通过HandlerInterceptorAdapter拦截HTTP Request GET方法,并将Request查询参数存储到一个对象中,供PagingAndSortingRepository使用。计划是覆盖 findAll(Pageable p),Spring Data Rest 默认使用,调用 findAll(Specification s, Pageable p) 允许动态过滤。
我已经使用 Spring 提供的 Request Scope 来保存查询参数,以允许我在请求的整个生命周期中使用它们。
问题是我无法从 Repository 接口文件访问 QueryParam 对象。我尝试按照这个 Whosebug 解决方案将依赖项注入到接口文件中,但它不起作用:Spring Dependency injection for interfaces
Spring Data Rest 尝试通过尝试基于函数名称构建 SQL 查询来创建端点。即使我试图通过创建一个可以查询的函数来欺骗 Spring Data 来解决这个问题,然后用我在下面实现的 SampleRepositoryComponents 覆盖它,我也无法获取存储在 QueryParam 中的数据。
其他人也提出了请求以允许 Spring Data Rest 忽略某些方法:https://github.com/spring-projects/spring-data-rest/pull/286
查询参数:
public class QueryParam {
String query_string;
Map<String, String[]> parameter_map;
public String getQuery_string() {
return query_string;
}
public void setQuery_string(String query_string) {
this.query_string = query_string;
}
public Map<String, String[]> getParameter_map() {
return parameter_map;
}
public void setParameter_map(Map<String, String[]> parameter_map) {
this.parameter_map = parameter_map;
}
}
示例存储库:
@RepositoryRestResource(collectionResourceRel = "Sample", path = "Sample")
public interface SampleRepository extends PagingAndSortingRepository<Sample, UUID>,
JpaSpecificationExecutor<Sample> {
// Cannot just use any custom name
@RestResource(exported = false)
public QueryParam getQuery_param();
default public Page<Sample> findAll(Pageable p) {
QuerySpecification<Sample> qs = new QuerySpecification<Sample>(getQuery_param());
return findAll(qs, p);
}
}
查询规范:
public class QuerySpecification<T> implements Specification<T> {
private QueryParam query_param;
public QuerySpecification(QueryParam query_param) {
this.query_param = query_param;
};
@Override
public Predicate toPredicate(Root<T> rt, CriteriaQuery<?> cq, CriteriaBuilder cb) {
// Build your custom predicate here
return null;
}
}
示例存储库组件:
@Component
public abstract class SampleRepositoryComponents implements SampleRepository {
@Autowired
private QueryParam query_param;
@Override
public QueryParam getQuery_param() {
return this.query_param;
}
public void setQuery_param(QueryParam query_param) {
this.query_param = query_param;
}
}
在 Querydsl and Web support Spring 数据扩展的帮助下,'from the box' 在 Spring 数据 REST 中实现了同样的功能。
只需从 QuerydslPredicateExecutor<MyEntity>
扩展您的回购协议(以及可选的 QuerydslBinderCustomizer<QMyEntity>
,默认实现 customize
方法,就像示例 here 中那样),然后您可以查询您的带过滤的 repo 数据(更多其他 - 支持分页和排序):
/myEntities?field1=value1&field2=value2&sort=field2,desc&size=10&page=2
不要忘记将 QueryDSL 依赖项添加到您的项目中(例如这样):
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<scope>provided</scope>
</dependency>
<build>
<plugins>
<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/annotations</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
然后编译你的项目(例如mvn compile
)让它'Q'类.