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

Posted

技术标签:

【中文标题】如何在 Spring JPARepository 中复制 Hibernate 的 @Where 功能【英文标题】:How to replicate the Hibernate's @Where functionality in Spring JPARepository 【发布时间】:2017-05-18 02:51:26 【问题描述】:

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

@Entity
@Where(clause="user_type_cd != 'X'")
public class User 
...

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

例如,

@Repository("userRepo")
public interface UserRepository extends JpaRepository<User, Long> 
    User findByLoginId(String login);

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

但是,有时候,我们还是想找到这样的用户,所以我在考虑搬家

@Where(clause="user_type_cd != 'X'")

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

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

clause="user_type_cd != 'X'"

无需我为每个查找器方法显式编写自定义 @Query("... and user_type_cd != 'X'") 的存储库所有方法的标准。

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

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

【问题讨论】:

FWIW @Where 与 JPA API 无关。也许您的意思是将其标记为休眠 嗯,我希望使用 Spring Data JPA 存储库复制 @Where 的行为。换句话说,我的存储库中有相当多的查找器方法,我希望它们都将这一块标准附加到他们所做的每个查找器查询中。所以在我看来,这不是休眠特定的事情,而是我如何使用 Spring Data JPA 完成这项工作。 【参考方案1】:

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

    Spring data jpa specifications,或 Querydsl

通过简单的谷歌搜索,您可以获得丰富的信息。这是一个有用的spring.io blog,其中包含两者的详细信息,以及如何将它们与 JpaRepository 一起使用。

【讨论】:

您能否从这些链接中获取信息并向我们展示它如何应用于 OP 的问题?

以上是关于如何在 Spring JPARepository 中复制 Hibernate 的 @Where 功能的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JpaRepository spring boot 中使用 postgresql array_agg 函数?

如何使用 Spring Boot JpaRepository 保存多个表

在 spring jparepository 中加入多个表

如何在 Spring JpaRepository 中使用 JPQL 选择组中的最新记录?

如何将对象从一个 JpaRepository 转换为另一个 JpaRepository

在测试中使用 Spring JpaRepository