当前位置: 首页 > 知识库问答 >
问题:

Spring启动动态查询与Spring数据Rest

慕容嘉荣
2023-03-14

我想做一些有趣的事情,我希望能够动态地构建SQL查询过滤器使用Spring Boot 1.5.9和Spring Data Rest,而不需要编写控制器。我觉得我可能走在正确的道路上,但我有点卡住了。

这个想法是通过使用HandlerInterceptorAdapter截取HTTP请求GET方法,并将请求查询参数存储到PagingAndSortingRepository可以使用的对象中。计划是重写Spring Data Rest默认使用的findAll(Pagable p),调用findAll(规范s,Pagable p)以允许动态过滤。

我使用Spring提供的请求范围来保存查询参数,以便在请求的整个生命周期中使用它们。

问题是我无法从存储库接口文件访问QueryParam对象。我尝试按照stackoverflow解决方案将依赖项注入到接口文件中,但它不起作用:Spring接口依赖项注入

SpringDataREST尝试通过基于函数名构建SQL查询来创建endpoint。即使我试图通过创建一个可以查询的函数来欺骗Spring数据,然后用我在下面实现的SampleRepositoryComponents覆盖它来绕过这个问题,我也无法获得存储在QueryParam中的数据。

其他人也发出了拉取请求,允许Spring数据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;
  }
}

SampleRepositoryComponents:

@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;
  }
}

共有1个答案

邴姚石
2023-03-14

在Querydsl和Web支持Spring数据扩展的帮助下,Spring数据REST中的“从盒子”已经实现了同样的功能。

只是扩展你的repos从QuerydslPredicateExecator

/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>

然后编译您的项目(例如mvncile),让它生成“Q”类。

 类似资料:
  • 我们希望按属性名对查询结果进行排序。此属性名称可能不同。根据这一需求,哪一个是用spring SDN来完成它的最佳解决方案? 我找到的唯一解决方案是使用OGM并动态创建查询。 有什么建议吗?也许是Spring SDN的增强?

  • 我的webapp中有一个过滤器,允许按车辆类型、品牌、燃油、州和城市进行搜索,但所有这些过滤器都是可选的。 如何使用存储库实现这一点。 控制器类 服务类 我还没有实现任何东西,因为我不知道如何实现这个过滤器。 车辆等级 车型和品牌是另一张桌子上的...我是葡萄牙人我把密码翻译成了英文... 当它发生时,我需要做什么?

  • 我想使用返回对象的注释在spring boot中编写一个查询。 所以,我的问题是:分页的最佳JPA查询类型(JPQL,NativeQuery,...)是什么? 提前谢谢你!

  • 我想在我的查询中调用一个函数。例如: 在我的myTableRepository中,我可以执行以下操作: 但向语句添加函数调用不起作用: 有没有办法让它在JPQL中工作? 我的错误:

  • Spring数据中是否有一种方法可以动态地形成where子句? 我想要做的是有一个方法(类似于findBy/get方法),它运行WHERE和and并使用所提到的属性,这些属性不是空的。 例如, 我们的方法如下所示 谢了。

  • 我想在用户在UI中选择的MongoDB中的文档列表上运行批量删除操作,因此我需要动态构建一个如下所示的查询(or子句为所选的每个文档展开): 刚才我正在使用字符串串联来实现这一点。 是否可以使用Spring数据MongoDB标准生成器(org.springframework.Data.MongoDB.core.query.Criteria)构建此查询?