如何在 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 中使用 JPQL 选择组中的最新记录?