2015-01-21 4 views
3

Я успешно реализовал мягкое удаление (как флаг удаления) для объектов моих приложений. Однако у меня есть одна проблема. Я написал собственный JPARepository с методами findAll и count, которые отфильтровывают удаленные. Я делаю это со спецификацией: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)); 
     } 
    }; 

Если предприятие имеет, например, OneToMany списка дочерних объектов, которые также мягкие удалены, этот список не фильтруется, поскольку запрос не выполняется его хранилище.

Мой вопрос: могу ли я изменить приведенную выше спецификацию, чтобы дети, которые были мягко удалены, были отфильтрованы? Альтернативой будет фильтрация дочерних элементов с отражением (вручную после запроса), но это не будет выполнено.

ответ

0

С Hibernate, вы можете использовать @Where аннотации на ваших лицах

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

Тем не менее, обратите внимание на @SQLDelete альтернативу вашей реализации мягкого удаления.

+0

Мы пробовали это. Добавочное предложение where добавляется к запросам, выполняемым самим объектом, запросы, выполняемые родителями с нетерпением, но не запросы с ленивым набором. На стороне примечания: мы пытаемся избежать команд, связанных с Hybernate, потому что мы не хотим никакой прямой зависимости. Вот почему я создал специальное решение для мягкого удаления вместо использования предложения where. Предложение where - хорошая идея. –

Смежные вопросы