javaspringjpaspring-dataspring-data-jpa

Handling soft-deletes with Spring JPA


I have a table Stuff defined as...

id, <fields>..., active

Active is the soft-delete flag and is always 1 or 0. Long term this may go away in favor of a historical table.

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

In code, we always use active records. Is there any way to get Spring to always append an active=1 condition to queries generated for this repository? Or more ideally allow me to extend the grammar used to generate the queries?

I understand that I can create named @queues everywhere but then I lose the convenience of the generated queries. I also want to avoid polluting the interface with "active" methods.

I am using Hibernate 4.2 as my JPA implementation if that matters.


Solution

  • This is an old question, and you probably already found the answer. BUT, for all the Spring/JPA/Hibernate programmers out there seeking for answer -

    Say you have an entity Dog:

     @Entity
     public class Dog{
    
     ......(fields)....        
    
     @Column(name="is_active")
     private Boolean active;
     }
    

    and a repository:

    public interface DogRepository extends JpaRepository<Dog, Integer> {
    } 
    

    All you need to do is add the @Where annotation on the entity level, resulting:

    @Entity
    @Where(clause="is_active=1")
    public class Dog{
    
    ......(fields)....        
    
    @Column(name="is_active")
    private Boolean active;
    }
    

    All the queries performed by the repository will automatically filter out the "non-active" rows.