如何使用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
。