2015-01-21 1 views
3

내 응용 프로그램의 엔터티에 대한 소프트 삭제 (일명 삭제 플래그)를 성공적으로 구현했습니다. 그러나, 나는 하나 남은 문제가있다. 필자는 findAll을 사용하여 사용자 정의 JPARepository를 작성했으며 삭제 된 필터를 필터하는 count 메소드를 작성했습니다. 나는 사양이 작업을 수행 : 엔티티 예를 들어도 소프트 삭제 된 개체의 OneToMany 자식 목록이JPA 사양 : 하위 항목 필터링

softDeleteSpecification = new Specification<T>() { 
     @Override 
     public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 
      return cb.or(cb.isNull(root.get(DELETED_FIELD_NAME)), cb.equal(root.<T>get(DELETED_FIELD_NAME), false)); 
     } 
    }; 

경우,이 목록은 필터링되지 않은 쿼리가 저장소에 의해 실행되지 않기 때문에.

내 질문 : 위의 사양을 수정하여 소프트 삭제 된 하위 항목을 걸러 낼 수 있습니까? 대안은 리플렉션 (수동으로 쿼리 후)으로 하위 항목을 필터링하는 것이지만 성능이 떨어지는 것은 아닙니다. 최대 절전 모드와

답변

0

, 당신은, 당신의 실체 말했다

@Entity 
@Where(clause = "deleted = 0") 
public class MyEntity { 
... 

@Where 주석을 사용 소프트 삭제의 구현에 대한 대안에 대한 @SQLDelete 좀 걸릴 수 있습니다.

+0

우리는 그것을 시도했습니다. 추가 where 절이 엔터티 자체에서 수행 된 쿼리에 추가되고, 쿼리는 eager fetching으로 부모에서 수행되지만 지연 페칭에서는 수행되지 않습니다. 참고 : 우리는 직접적인 종속성을 원하지 않기 때문에 Hybernate 관련 명령을 피하려고합니다. 그래서 where 절을 사용하는 대신 사용자 지정 소프트 삭제 솔루션을 구축했습니다. where 절은 좋은 생각입니다. –