【问题标题】:spring boot fancy filtering for rest based on fields values基于字段值的spring boot花式过滤休息
【发布时间】:2018-07-17 14:35:14
【问题描述】:

我正在开发一个公开一些端点的 Spring Boot 应用程序。我想要实现的是提供一种基于字段值的精美过滤机制。假设我有两个领域模型:文章和作者,其中一篇文章可以由作者列表编写。

@Entity
public class Article{
    @Id
    private String id;
    private String title;
    private String body;
    @OneToMany
    private List<Author> authors;

    //Getters and setters
}

@Entity
public class Author{

    @Id
    private String id;
    private String firstname;
    private String lastname;

    //Getter and setters
}

现在,我可以使用端点访问我的所有文章:localhost:8080/api/articles,并使用我想要集成的新过滤系统,我想要类似的东西:localhost:8080/api/articles?title=myTitle 按标题检索文章,或 localhost:8080/ api/articles?title=mytitle&author.firstname=Jhon 按标题和作者名字检索文章。

我查看了 JPA 规范并成功地对我的模型的直接字段进行了第一次过滤,但我无法使其适用于嵌套字段或枚举类型。有没有图书馆或其他解决方案可以满足这种需求?

【问题讨论】:

标签: java spring spring-mvc jpa spring-boot


【解决方案1】:

QueryDsl 在这种情况下是一种选择。当然,也可以使用 QueryDsl 查询嵌套字段。
对于您需要的情况,这将是谓词

BooleanExpression predicate = QArticle.title.eq(mytitle);
predicate.and(QArticle.authors.any().firstname.eq(John))
ArticleRepository.findAll(predicate);

【讨论】:

  • 这是一个非常有趣的线索,但是 QArticle 类是什么?!能不能详细点,因为我关注了Baeldung的文章,他直接处理领域模型,领域模型谓词
  • 当您编译您的项目时,JPAAnnotationProcessor(您在 maven 中拥有)为每个实体类生成一个新类(带有前缀 Q)。编译您的代码并检查 target 下的 generate-sources 文件夹
  • 我会深入研究这个,并让你更新,谢谢你的提示,如果它有效,我不会忘记接受答案
  • 当然。只是一个忠告。使用 QueryDsl,您需要首先编译您的代码,这将生成这些 Q 文件,然后您需要在 IDE 中包含生成的源文件夹作为源目录,以免出现编译时问题。这整件事仅在您在 IDE 中工作时才发生。但是当你部署和运行时,这应该不是问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 2021-10-28
  • 2021-10-20
  • 1970-01-01
  • 2017-11-13
  • 2021-05-19
相关资源
最近更新 更多