如何使用Hibernate为Spring数据JPA的所有查找方法添加全局where子句?

我们正在使用Spring数据JPA和hibernate开发Web应用程序。

在应用程序中,每个实体都有一个compid字段。 这意味着每个数据库调用(Spring Data方法)都必须使用compid进行检查。

我需要一种方法,这个“compid =?” 检查每个查找方法是否自动注入。 因此,我们不必特别打扰编译检查。

这可能是从Spring Data JPA框架实现的吗?

可能是Hibernate的注释@Where会帮助你。 它为任何JPA查询添加了给定条件。 例如

 @Entity @Where(clause = "isDeleted='false'") public class Customer { //... @Column private Boolean isDeleted; } 

更多信息: 1,2

像其他人说的那样,没有固定的方法

一个选项是通过示例查看Query – 从spring数据文档 –

 Person person = new Person(); person.setFirstname("Dave"); Example example = Example.of(person); 

因此,您可以在对象或父JPA对象中默认compid

另一个选项是自定义存储库

同意Abhijit Sarkar。

您可以实现您的目标hibernate监听器和方面。 我可以建议如下:创建一个注释@Compable (或任何你称之为)的标记服务方法创建CompAspect,它应该是一个bean和@Aspect 。 它应该有这样的东西

 @Around("@annotation(compable)")` public Object enableClientFilter(ProceedingJoinPoint pjp, Compable compable) throws Throwable { Session session = (Session) em.getDelegate(); try { if (session.isOpen()) { session.enableFilter("compid_filter_name") .setParameter("comp_id", your_comp_id); } return pjp.proceed(); } finally { if (session.isOpen()) { session.disableFilter("filter_name"); } } } em - EntityManager 

3)您还需要提供hibernatefilter。 如果使用注释,则可以如下所示:

 @FilterDef(name="compid_filter_name", parameters=@ParamDef(name="comp_id", type="java.util.Long")) @Filters(@Filter(name="compid_filter_name", condition="comp_id=:comp_id")) 

所以你的条件where compid = ? 将是下面的@Service方法

  @Compable someServicweMethod(){ List l = someRepository.findAllWithNamesLike("test"); } 

这基本上是用于选择,对于更新/删除此方案需要EntityListener