Spring data jpa - 在执行前修改查询

问题描述 投票:0回答:2

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

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

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

spring-data spring-data-jpa
2个回答
1
投票

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

添加通用查询增强的基础设施

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

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

原来的问题已经有1年了。您找到干净的方法了吗?


0
投票

我们的项目也有同样的需求。你有什么解决办法吗?

© www.soinside.com 2019 - 2024. All rights reserved.