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.
@Where(clause="is_active=1")
is not the best way to handle soft delete with spring data jpa.
First, it only works with hibernate implement.
Second, you can never fetch soft deleted entities with spring data.
My solution is el provided by spring data. #{#entityName}
expression can be used on generic repository represent concrete entity type name.
And code will be like this:
//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);