mysql - 使用 Hibernate @SQLDelete 跨所有实体进行软删除

标签 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'")

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

最佳答案

如果您使用 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.

像这样重写基本存储库。所有子仓库接口(interface)都将具有软删除能力。

关于mysql - 使用 Hibernate @SQLDelete 跨所有实体进行软删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8745256/

相关文章:

java - 在Java中,Spring无需任何脚本即可维护数据库

java - hibernate注释类中出现错误

java - 带下划线的 Spring Data Rest 排序字段

mysql - 将 MySQL 变量与 Sequelize 结合使用

java - 如何通过 Spring Boot 使用相同的实体连接 3 个数据库?

jpa - Spring Data JPA Projection嵌套列表投影接口(interface)

Spring Data Cassandra 计数器更新

php - 在 PHP 中将日期转换为时间格式输出

mysql - SQL - 当记录不存在时不从另一个表中检索记录

mysql - 如何在同一列上多次使用 SELECT 查询,SQL