Java 基于profile的Spring数据实体附加过滤
我有一个DB表,我们称它为用户。在这个表中,我有一些标准字段,如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... } 现在,我需要能够根据环境过
姓名
,姓氏
,年龄
,等等。
此表映射到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配置文件与之匹配。但是,我不想通过我的应用程序公开它,因为这只是配置,而不是业务逻辑