【问题标题】:Filter entities in spring repository过滤spring存储库中的实体
【发布时间】:2020-07-12 06:25:22
【问题描述】:

是否可以将过滤器应用于带有注释的结果而不是扩展方法名称?

例如:

@Repository
public interface JobRepository extends JpaRepository<Job, Long> {
    List<Job> findAllByUserAndEnabledIsTrue(User u);
}

我在这里应用过滤器'enabled == true'。但是假设我们有很多方法。用扩展名称编写它们很不方便。我可以将此过滤器应用于整个存储库吗?

我发现 @FilterDef 但我不知道怎么用,也不知道spring是否支持这个注解。

【问题讨论】:

  • 我认为这是不可能的。

标签: spring hibernate spring-boot spring-data-jpa spring-data


【解决方案1】:

据我所知,Spring Data JPA 不依赖于 Hibernate,它可以与任何 JPA 实现一起使用。 Hibernate 的@Filters 不是JPA 标准,所以简单的答案是否定的! Spring JPA 不支持@Filters。

但是您可以使用 AOP 应用 @Filters,并且只需在您的存储库方法上应用方面。

顺便说一句,我认为更好的解决方案是使用 Spring Data JPA 的 @Query 注释进行手写查询。因为这样你可以根据上下文含义来命名方法,而不是根据它们的内部实现来命名。

例如,您可以将方法命名为 findActiveJobsForUser,这样可能更有意义和可读性。

【讨论】:

  • 如果您使用 Hibernate 作为您的持久性提供程序(就像大多数人一样),那么使用 Hibernate 过滤器没有任何问题或不工作。 JPA 不支持它,但这并不意味着没有使用它的方法(您甚至在回答中指出了这一点)。
  • 我知道,但是 Spring Data JPA 不会在 Hibernate Session 上调用 enableFilter()disableFilter 方法。当你使用 Spring Data 时,你不想将 Hibernate Session 暴露给其他层。
  • 即使在使用 JPA 时,您也可能(偶尔)想要使用底层机制,因为该机制比单独的 JPA 可以做的更多。但正如您所说,您可以使用 AOP 来做到这一点。
  • @AmirPashazadeh 请问,你能提供一个 AOP 方法的例子吗?我无法想象这个。此 AOP 过滤器将作用于查询(因此过滤器将在数据库中)或查询结果?
  • 在 AOP 中,您必须访问当前的休眠会话并在其中启用过滤器。我会尽快提供样品
猜你喜欢
  • 2021-01-03
  • 1970-01-01
  • 2016-07-02
  • 2018-07-24
  • 2019-08-26
  • 2020-04-12
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多