Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于profile的Spring数据实体附加过滤_Java_Spring_Hibernate_Spring Boot_Spring Data Jpa - Fatal编程技术网

Java 基于profile的Spring数据实体附加过滤

Java 基于profile的Spring数据实体附加过滤,java,spring,hibernate,spring-boot,spring-data-jpa,Java,Spring,Hibernate,Spring Boot,Spring Data Jpa,我有一个DB表,我们称它为用户。在这个表中,我有一些标准字段,如姓名,姓氏,年龄,等等。 此表映射到JPA实体类: @Entity @Table(name = "users") public class User { @Id @Column(name = "login") private String id; @Column(name = "name") private String name; //etc... } 现在,我需要能够根据环境过

我有一个DB表,我们称它为用户。在这个表中,我有一些标准字段,如
姓名
姓氏
年龄
,等等。 此表映射到JPA实体类:

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

    @Column(name = "name")
    private String name;
    //etc...
}
现在,我需要能够根据环境过滤一些用户。可以根据Spring活动配置文件定义环境。 我的假设是添加新的DB列,比如说
布尔过滤器
,并基于Spring概要文件来过滤或不过滤用户

问题在于实现此功能的最佳方式,以便它干净且可维护。 一种方法是拥有两个不同的
@Repository
,并基于profile init选择正确的存储库。一个存储库将返回所有用户,而另一个存储库将只返回
filter=false
的用户


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

不是拦截器,但可以使用jpa标准执行此操作:


通过这种方式,您可以动态配置所需的内容。好吧,在运行时,它会比普通的旧解决方案慢一点,其中有几个@Repository标记为@conditionalnproperty,或者您选择的其他配置,但是,它满足了您更改行为的需求,而无需引入多个repo。您要做的是声明规范/默认规范并传递它。这样,您以后也可以在运行时配置搜索

也许被误解了,但我不认为增加专栏是一个好的解决方案。它只会占用您的数据库中更多的内存,使您的数据与服务环境紧密耦合。@没有人会乐意考虑其他解决方案。我不认为我的解决方案是最好的,因此,我会很感激任何其他的解决方案,可以提供感谢的答案。我不喜欢这种方法的地方在于,在这种情况下,存储库将了解spring概要文件及其运行环境。我不会在存储库中有这种依赖关系。在使用规范的方法中,您的存储库将不知道配置文件。然而,对于不同的问题/环境有不同的解决方案真的那么糟糕吗?规范看起来很有趣。我一定要调查一下。有一个单独的解决方案并不坏。我想要实现的主要目标是从应用程序外部注入必须使用的解决方案。这就是为什么我认为Spring配置文件与之匹配。但是,我不想通过我的应用程序公开它,因为这只是配置,而不是业务逻辑