Java 在查询中加入特定检查的最佳实践-需要专家意见
我正在开发一个JavaEE应用程序。我们已经在SpringMVC、JPA、Gradle和PostgreSQL上开发了它 我正在使用以下命令从表中选择特定的结果集:Java 在查询中加入特定检查的最佳实践-需要专家意见,java,sql,spring,postgresql,jpa,Java,Sql,Spring,Postgresql,Jpa,我正在开发一个JavaEE应用程序。我们已经在SpringMVC、JPA、Gradle和PostgreSQL上开发了它 我正在使用以下命令从表中选择特定的结果集: select * from table_name 我想做的是,我想排除status列具有值permanually\u DELETE的所有记录 select * from table_name where column_name!='PERMANENTLY_DELETE' 这个应用程序相当大,我在整个应用程序中有很多复杂的连接。
select * from table_name
我想做的是,我想排除status
列具有值permanually\u DELETE
的所有记录
select *
from table_name
where column_name!='PERMANENTLY_DELETE'
这个应用程序相当大,我在整个应用程序中有很多复杂的连接。我必须在所有查询中添加并集成此检查以合并更改
一种方法是每次我访问表时更新条件,另一种方法是编写拦截器,但这需要非常小心,因为我需要在所有现有连接中都使用拦截器
如果ERP中有500多个查询,您需要在整个应用程序中集成此类检查,那么解决此类问题的最佳方法是什么
编辑:
我使用的是JPA,它不仅仅是一个简单的查询,因此我无法使用视图来解决这个问题。实现全面过滤的常用技术是使用
视图。您必须,然后只需在代码中执行一次C/replace操作,将对旧的未筛选表的所有引用替换到您创建的视图中
CREATE VIEW not_deleted AS
SELECT *
FROM table_name
WHERE where column_name!='PERMANENTLY_DELETE';
然后将表名的所有访问权限替换为未删除
,您就完成了。我的2美分:
- 您可以在YOUR源代码中查找所有出现的列名称
grep
将是最可靠的解决方案(简单到足以可靠),但其输出可能包含大量垃圾
- 在postgres级别创建数据库视图并将其用作表:我指的是以下步骤:
1) 将现有表名称重命名为其他名称(即
all\u table\u name
)
2) 将数据库视图创建为create view table_name as select*from all_table_name where column_name!='永久删除“
因此,默认情况下,视图将以这种方式过滤逻辑删除的实体。进一步的步骤是添加将视图上的DML操作映射到原始表的命令。我不完全确定它是否会起作用,但我想试试 这是一样的,我将不得不上传所有的查询,将不得不改变表_名称查看name@DanyalSandeelo-在大多数情况下,视图
可以在任何表格可以使用的地方使用。你可以加入
并根据自己的意愿进行进一步筛选。我知道,但必须在任何地方更改查询..必须执行替换。。但是是的,这是可能的。。我是通过JPA做的,这不仅仅是一个简单的查询。我已经发布了这个问题,以便其他人能够轻松理解:)@Danyalsandelo-也许你可以重命名该表,并创建一个与原始表同名的视图,但这将是非常粗糙的。有意义的@oldcurmudgeonar你使用SQL获取数据还是JPA?因为这对anwser非常重要。然后再次请指定您使用的JPA提供程序。另外,这不是你的问题所说的,因为它提到了你正在执行的SQL,而不是JPA或HQL。。。那么你到底在用什么…@M.Deinum你能详细说明一下吗?我正在使用datasource、repository和queryDSL。您的问题清楚地表明您正在使用SQL从表中选择数据。所以不管你有没有JPA,这都会被忽略。另外,您使用JPA的事实与您可以或不能使用视图无关,JPA并不关心它是什么。您基本上有一个问题,但没有提供实际的代码,您提供的是实际运行的代码的代表。那么,你希望我们如何帮助你呢?我使用JPA来做,所以没有简单的查询,都是使用查询DSL来完成的,这很好。我建议把你的桌子变成一个过滤视图。这样,您可以透明地在视图上执行SELECT
语句。如果还添加了而不是
触发器,则java代码在数据库重构后可以正常工作,无需进一步修改。@erosb:对于任何最新版本的Postgres,这样的简单视图甚至不需要而不是
触发器。它可以直接更新。