我有一个表Stuff定义为…
id, <fields>..., active
活动状态是软删除标志,并且始终为1或0。从长远来看,这可能会取代历史表格。
public interface StuffRepository extends JpaRepository<StuffEntity, Long> {}
在代码中,我们始终 使用活动记录。有什么方法可以让Spring始终active=1为该存储库生成的查询附加条件?或更理想的情况是允许我扩展用于生成查询的语法?
我知道可以@queues在任何地方创建named ,但是随后我就失去了生成查询的便利。我还想避免使用“活动”方法污染接口。
@queues
如果重要的话,我正在使用Hibernate 4.2作为我的JPA实现。
这是一个古老的问题,你可能已经找到了答案。但是,对于所有寻求答案的Spring / JPA / Hibernate程序员来说-
假设你有实体狗:
@Entity public class Dog{ ......(fields).... @Column(name="is_active") private Boolean active; }
和一个存储库:
public interface DogRepository extends JpaRepository<Dog, Integer> { }
你需要做的就是在实体级别添加@Where批注,结果是:
@Entity @Where(clause="is_active=1") public class Dog{ ......(fields).... @Column(name="is_active") private Boolean active; }
存储库执行的所有查询将自动过滤掉“非活动”行。
@Where(clause="is_active=1") 不是使用spring数据jpa处理软删除的最佳方法。
@Where(clause="is_active=1")
首先,它仅适用于hibernate工具。
其次,你永远无法使用spring数据获取软删除的实体。
我的解决方案是由spring数据提供的。#{#entityName}可以在通用存储库上使用表示具体实体类型名称的表达式。
#{#entityName}
和代码将是这样的:
//Override CrudRepository or PagingAndSortingRepository's query method: @Override @Query("select e from #{#entityName} e where e.deleteFlag=false") public List<T> findAll(); //Look up deleted entities @Query("select e from #{#entityName} e where e.deleteFlag=true") public List<T> recycleBin(); //Soft delete. @Query("update #{#entityName} e set e.deleteFlag=true where e.id=?1") @Modifying public void softDelete(String id);