Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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 在查询中加入特定检查的最佳实践-需要专家意见_Java_Sql_Spring_Postgresql_Jpa - Fatal编程技术网

Java 在查询中加入特定检查的最佳实践-需要专家意见

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' 这个应用程序相当大,我在整个应用程序中有很多复杂的连接。

我正在开发一个JavaEE应用程序。我们已经在SpringMVC、JPA、Gradle和PostgreSQL上开发了它

我正在使用以下命令从表中选择特定的结果集:

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,这样的简单视图甚至不需要
而不是
触发器。它可以直接更新。