当前位置: 首页 > 知识库问答 >
问题:

所有数据库查询的全局Hibernate筛选器

孟思远
2023-03-14

我正在为我的Web应用程序使用Spring MVC和HiberNate。我正在寻找一种方法来创建一种全局Hibernate过滤器,该过滤器将应用于我的DAO类中的每个查询,而不必在每个DAO方法中显式启用它。

要求按用户选择的会话变量过滤记录。因此,我们的查询参数将保存在会话中,该会话中的所有DAO查询都需要通过该变量过滤结果。这里的目的是避免每个DAO方法中的所有可重复过滤代码

欢迎任何想法!

共有1个答案

闻人越
2023-03-14

把我处理这个问题的方式放在这里。以下是基于与@Rp的讨论以及此处提出的建议。

三个主要元素参与了配置:< br> - Spring的会话范围bean < br >-package-info . Java < br >-Spring AOP < br > < br >


我创建了一个会话范围的 Spring bean,它将保存我的用户选择的变量。该变量将根据用户的请求通过 spring 控制器映射方法进行修改。由于被保存在 Spring 管理的 bean 中,借助 spring 的依赖注入,我可以在应用程序中的任何位置访问会话变量。

@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class SessionParam implements Serializable{

  private String sessParam;
..
..
}

接下来,我在包级别定义了我的hibernate过滤器。这是在< code>package-info.java文件中完成的。因此,这个包中的所有实体都继承了这个过滤器。

 @FilterDef(name="GLOBAL_FILTER",   parameters = {@ParamDef(name="sessParam", type="string")}, 
                                    defaultCondition = "sessParam = :sessParam")

package com.company.app.entity;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.FilterDefs;
import org.hibernate.annotations.ParamDef;

< br >包中的实体使用hibernate的@Filter注释进行注释,如下所示:

@Entity
@Filter(name="GLOBAL_FILTER")
@Table(name = "TABLE_XYZ", schema = "SCHEMA_ABC")
public class TableXyz implements Serializable {
...
}

最后,使用hibernate的会话工厂的getCurrentSession()方法上的AspectJ方面拦截所有的DAO查询。

下面是方面类。

@Aspect
@Component
public class GlobalFilter {

    @Autowired
    SessionParam sessionParam;


    @Pointcut("execution(* org.hibernate.SessionFactory.getCurrentSession(..))")
    protected void hibernateSessionFetch(){

    }

    @AfterReturning(pointcut = "hibernateSessionFetch()", returning = "result")
    public void enableGlobalFilter(JoinPoint joinPoint, Object result){

        Session session = (Session) result;

        session.enableFilter("GLOBAL_FILTER").setParameter("sessParam", sessionParam.getSessParam());

    }
}

现在,对带有“GLOBAL_FILTER”的实体的所有查询都对所需变量进行了条件检查。DAO 方法中不需要在每个查询中进行显式条件检查。

 类似资料:
  • 我正在尝试使用Spring Boot和Spring数据通过鉴别器实现多租户。 我创建了一个抽象类来表示多租户实体。类似于此: 如何全局启用多租户Hibernate过滤器?

  • 我们正在使用Spring boot+Spring data JPA和Hibernate开发一个多租户web应用程序。 多租户是通过拥有一个组织表来实现的,该表作为外键连接到几乎每个表上。这意味着每个DB调用(Spring Data repository查询方法)都必须用组织ID进行检查。 谢谢你抽出时间。

  • 我看不到任何关于何时应该使用查询或过滤器或两者结合的描述。他们之间有什么区别?谁能解释一下吗?

  • 我有一个查询,我需要过滤出结果。 这是我的查询 我得到一个错误,说注册[query]。我显然有一个筛选字段的查询。我遵循elasticsearch页面上筛选的查询文档中给出的格式。https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html

  • 嗨,最近我一直在研究REST API。我在想,如果没有参数,我怎么才能得到所有的数据。我只能通过categoryId获得数据,如下所示。http://..../categorys?categoryID=2数据被选择并显示如下。

  • 如何在应用程序级别配置默认查询超时。我使用spring、hibernate和db2作为后端。在datasource级别设置超时不是一个选项,因为我们使用的是旧版本的IBM WebSphere。我尝试在事务管理器中配置defaultTimeout,但这没有帮助。我也不想集成c3p0连接池。hibernate是否为在应用程序级别设置全局查询超时提供了其他选项,如果是,如何配置。