java - 基于配置文件的Spring数据中实体的附加过滤器
问题描述
我有一个数据库表,我们称之为用户。在此表中,我有标准字段,如name
、surname
、age
等。此表映射到 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
.
我不喜欢这个实现的是会有很多代码重复。对于每个存储库方法,我必须在第二个存储库中使用相同的方法,但基于一列进行过滤。有没有办法为给定数据库实体上的每个读取查询自动定义某种“拦截器”?
解决方案
不是拦截器,但可以使用 jpa 标准来做到这一点:docs
这样你就可以动态配置你想要的。Afaik,在运行时它会比普通的旧解决方案慢一点,几个@Repository 标记有@ConditionalOnProperty,或者您选择的其他配置,但是,它满足您改变行为的要求,而无需引入多个存储库。您想要做的是声明 Specification /default 并传递它。这样您以后也可以在运行时配置您的搜索。
推荐阅读
- slam - 规划器 ORB 视觉 SLAM
- python-3.x - Python 查找并计算列表列表中的项目
- ruby-on-rails - Ruby 从方法中获取信息
- javascript - loadEventEnd 结果改变有时来 0 有时来 500ms
- javascript - JS 如何处理同一个变量的不同数据类型?
- html - 使用 Bootstrap 5 Jumbotron 将项目居中对齐
- css - WordPress Plugin Boilerplate (wppb) - 我应该把管理员和公共双方共享的 CSS 文件放在哪里?
- excel - 使用与 Dropbox 选择不同的文本更新单元格
- excel - Excel中未排序数据的3路相关下拉列表?
- python - 对齐文本或注释以在 python 3.8 中绘图