使用 Hibernate @SQLDelete 对所有实体进行软删除

ila*_*ana 6 mysql hibernate spring-data spring-data-jpa

我们有一个相当复杂的数据模型,并且在 MySQL 之上使用 Hibernate 和 Spring Data JPA。我们有一个所有域对象扩展的基类,以最小化样板代码。我希望能够仅使用此类在我们所有的域对象中添加软删除功能。但是,@SQLDelete在子句中需要表名:

@SQLDelete(sql="UPDATE (table_name) SET deleted = '1' WHERE id = ?")
@Where(clause="deleted <> '1'")
Run Code Online (Sandbox Code Playgroud)

有人知道一种概括 SQLDelete 语句并允许扩展域对象填充它们自己的表名的方法吗?

Tim*_*mYi 4

如果您使用 hibernate 和@SQLDelete,那么您的问题没有简单的解决方案。但是您可以考虑使用 Spring Data 的表达式语言进行软删除的另一种方法:

@Override
@Query("select e from #{#entityName} e where e.deleteFlag=false")
public List<T> findAll();

//recycle bin
@Query("select e from #{#entityName} e where e.deleteFlag=true")
public List<T> recycleBin(); 

@Query("update #{#entityName} e set e.deleteFlag=true where e.id=?1")
@Modifying
public void softDelete(String id); 
//#{#entityName} will be substituted by concrete entity name automatically.
Run Code Online (Sandbox Code Playgroud)

像这样重写基础存储库。所有子存储库接口都将具有软删除能力。