首页 > 解决方案 > 基于配置文件的Spring数据中实体的附加过滤器

问题描述

我有一个数据库表,我们称之为用户。在此表中,我有标准字段,如namesurnameage等。此表映射到 JPA 实体类:

@Entity
@Table(name = "users")
public class User {
    @Id
    @Column(name = "login")
    private String id;

    @Column(name = "name")
    private String name;
    //etc...
}

现在我需要有可能根据环境过滤一些用户。可以基于 Spring 活动配置文件定义环境。我的假设是添加新的 DB 列,比方说boolean filter,并基于 Spring 配置文件来过滤或不过滤用户。

问题是关于实现此功能的最佳方式,以便它干净且可维护。一种方法是有两个不同@Repository的并基于配置文件初始化正确的一个。一个存储库将返回所有用户,但另一个将仅返回具有filter=false.

我不喜欢这个实现的是会有很多代码重复。对于每个存储库方法,我必须在第二个存储库中使用相同的方法,但基于一列进行过滤。有没有办法为给定数据库实体上的每个读取查询自动定义某种“拦截器”?

标签: javaspringhibernatespring-bootspring-data-jpa

解决方案


不是拦截器,但可以使用 jpa 标准来做到这一点:docs

这样你就可以动态配置你想要的。Afaik,在运行时它会比普通的旧解决方案慢一点,几个@Repository 标记有@ConditionalOnProperty,或者您选择的其他配置,但是,它满足您改变行为的要求,而无需引入多个存储库。您想要做的是声明 Specification /default 并传递它。这样您以后也可以在运行时配置您的搜索。


推荐阅读