【问题标题】:Spring data jpa - modifying query before executionSpring data jpa - 在执行前修改查询
【发布时间】:2014-03-28 11:56:59
【问题描述】:

我正在进行一个项目,该项目将一些访问控制信息保存在数据库中。我们正在使用该访问控制信息来过滤用户可以看到的内容。我们使用的过滤器基于用户拥有的角色。我们希望使用 Spring Data 提供的 Repository 抽象,但我们希望能够在生成的查询被执行之前对其进行调整。有没有办法附加在执行查询之前将调用的侦听器或拦截器?这样我们就可以获得对查询对象的引用,并在执行查询之前对查询进行任何我们需要的调整。

我们正在考虑创建自己的 JpaRepositoryFactoryBean,以便我们可以覆盖 SimpleJpaRepository,如 here 所述。我们将覆盖 SimpleJpaRepository.getQuery 以调整查询。然后对于所有生成的查找器方法,我们正在考虑扩展 PartTreeJpaQuery 并覆盖 PartTreeJpaQuery$QueryPreparer。在 QueryPreparer 中,我们将覆盖 QueryPreparer.createQuery 方法。我们不确定这是否是在所有查询被执行之前访问它们的最简单方法。

我们考虑过添加一个 org.springframework.data.repository.core.support.QueryCreationListener,但它只会在创建查询时执行。我认为我们需要一些更有活力的东西。

【问题讨论】:

    标签: spring-data spring-data-jpa


    【解决方案1】:

    我不确定您是否已经知道,但 Spring Data 团队正在为下一个版本开发该功能,以便 Spring Security 团队届时可以添加对 ACL 的支持。

    Add infrastructure for generic query augmentation

    之前被阻止的 Spring Security 问题:Spring Security / Spring Data Acl Integration

    在我的公司中,我们创建了一个 JpaRepositoryFactoryBean,它将创建一个自定义存储库以允许我们为 ACL 添加过滤器,但我们只是为 findAll 和 findOne 方法这样做,因此我们失去了 Spring 的许多功能数据并决定恢复该更改,我们仍在考虑以一种自动执行此操作的方式。如果我们发现这太难了,我认为我们会将这个责任委托给存储库的客户端,并等待 Spring Security/Data 中对它的支持。

    原始问题已有 1 年。你找到了一种干净的方法吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 2015-08-04
      相关资源
      最近更新 更多