如何在 Spring JPARepository 中复制 Hibernate 的 @Where 功能

Ale*_*sky 6 spring jpql spring-data spring-data-jpa

我们的实体之一是使用 @Where 注释定义的,以处理“软删除”。

@Entity
@Where(clause="user_type_cd != 'X'")
public class User {
...
Run Code Online (Sandbox Code Playgroud)

现在,我们意识到有时我们仍然想找到这样的实体。不幸的是,@Where 注释按设计工作,因此我们在 JPARepository 中定义的查找器无法查找已删除的用户。

例如,

@Repository("userRepo")
public interface UserRepository extends JpaRepository<User, Long> {
    User findByLoginId(String login);
}
Run Code Online (Sandbox Code Playgroud)

如果用户已被删除,则如果 user_type_cd 等于 'X',则 findByLoginIs() 方法将不会返回用户。

但是,有时我们还是想找到这样的用户,所以我想把

@Where(clause="user_type_cd != 'X'")
Run Code Online (Sandbox Code Playgroud)

从实体到存储库的注释。这样,我不必更新存储库中的所有方法,它会自动将此标准添加到所有查找器。然后,我可以创建另一个存储库,该存储库将在不考虑软删除的情况下找到所有用户。

但是,我无法弄清楚可以用来使所有查找器自动附加

clause="user_type_cd != 'X'"
Run Code Online (Sandbox Code Playgroud)

存储库的所有方法的标准,而我不必为每个 finder 方法显式编写自定义 @Query("... and user_type_cd != 'X'") 。

因此,简而言之,我正在寻找所有自动生成的 findBy 以及将 user_type_cd != 'X' 附加到生成的每个 find 的方法。

关于如何在不使用自定义 @Query 注释的情况下完成此操作的任何想法?

小智 -1

我相信您正在寻找的是其中之一:

  1. Spring data jpa 规范,或
  2. 查询DSL

只需简单的谷歌搜索即可获得大量信息。这是一个有用的spring.io 博客,其中详细介绍了两者,以及如何将它们与 JpaRepository 一起使用。