java - 使用 Spring JPA 处理软删除

标签 java spring jpa spring-data spring-data-jpa

我有一个表 Stuff 定义为...

id, <fields>..., active

Active 是软删除标志,始终为 10。从长远来看,这可能会消失,取而代之的是历史表格。

public interface StuffRepository extends JpaRepository<StuffEntity, Long> {} 

在代码中,我们总是使用 Activity 记录。有什么方法可以让 Spring 始终将 active=1 条件附加到为此存储库生成的查询中?或者更理想地允许我扩展用于生成查询的语法?

我知道我可以在任何地方创建命名的 @queues ,但是我失去了生成查询的便利性。我还想避免使用“Activity ”方法污染接口(interface)。

如果这很重要,我将使用 Hibernate 4.2 作为我的 JPA 实现。

最佳答案

@Where(clause="is_active=1") 不是使用 spring data jpa 处理软删除的最佳方法。

首先,它只适用于 hibernate 工具。

其次,您永远无法使用 spring 数据获取软删除的实体。

我的解决方案是由 spring data 提供的。 #{#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); 

关于java - 使用 Spring JPA 处理软删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19323557/

相关文章:

java - Eclipse RCP 项目无法引用常规 Java 项目

java - 收到SIGTERM后如何正确关闭Spring bean?

java - 为什么 WebApplicationContext 无法访问我的 spring 组件?

java - MyBatis 遵循 JPA 吗?

java - JPA/Eclipse链接 : Understanding ClassLoader issues

java - 在 Elasticsearch 中使用 NativeSearchQueryBuilder 时,如果与 multiMatchQuery 结合使用,rangequery 过滤器会失败

java - 单线程应用程序中的 Hashtable 与 HashMap 性能

java - 如何将 Jersey 应用程序部署到远程 Tomcat 服务器

java - @RequestParam 省略但映射仍然正确完成

Java JPA,如何在不破坏-创建的情况下更新表?