«Обход» @SQLRestriction для сущностей для запросов JPAJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 «Обход» @SQLRestriction для сущностей для запросов JPA

Сообщение Anonymous »

Справочная информация
Я реализую как мягкое, так и принудительное удаление в приложении JPA/Hibernate. Учитывая объект с SQLRestriction, определенный для ограничения каждого запроса в JPA для возврата необратимо удаленных данных:

Код: Выделить всё

@Entity
@SQLRestriction("deleted = false")
public class Product extends Auditables {

@Id
@SnowFlakeIdValue(name = "product_id")
@Column(name = "product_id", columnDefinition = "BIGINT", updatable = false, nullable = false)
@Column(name = "deleted", nullable = false)
private boolean deleted = false;

@Version
private Long version;

@OneToMany(mappedBy = "product", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JsonManagedReference
private Set variants = new HashSet();

@OneToMany(mappedBy = "product", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JsonManagedReference
private Set
 images = new HashSet();
}
Обратите внимание, что @SQLRestrictions применяются всегда и не могут быть отключены. Они также не могут быть параметризованы. Поэтому они гораздо менее гибки, чем фильтры.

Означает ли это, что мы не можем выбирать данные, если соблюдено условие ограничения? В определенных случаях мне нужно запрашивать и управлять как неудаляемыми, так и мягко удаляемыми записями (например, для принудительного удаления), но @SQLRestriction применяется всегда и не может быть отключен или параметризован в соответствии с документацией Hibernate.
Дополнительная информация
Что касается обратимого удаления, то вместо использования @SoftDelete я обновляю поле «удалено» соответствующего продукта запроса.
Опробованные подходы
Поскольку я хотел иметь возможность как обратимого, так и принудительного удаления, я попробовал разные способы, продолжая использовать @ SQLRestriction, один из них был:

Код: Выделить всё

@Repository
public interface ProductRepository extends JpaRepository
 {
@Query("SELECT p FROM Product p")
@SQLRestriction("")
List findAllUnfiltered();

@Modifying @Transactional
@Query("DELETE FROM Product p WHERE p.productId = :productId AND p.deleted IN (true, false)")
void deleteProductPermanently(@Param("productId") Long id);

@Modifying @Transactional
@Query("DELETE FROM Product p WHERE p.deleted IN (true, false)")
void deleteAllProductsPermanently();
}
Ни одна из этих попыток не обходит @SQLRestriction.
Проблемы и вопросы
Есть ли способ обходить @SQLRestriction, когда это необходимо, сохраняя при этом автоматическую фильтрацию для обычных запросов? Если нет, то какой подход рекомендуется использовать?
  • Переключиться на фильтры гибернации?
  • Использовать EntityManager напрямую?
  • Написание собственных SQL-запросов?
  • Другие альтернативы?
Среда
Spring Boot Framework: 3.3.4
Спящий режим (.orm, ядро): 6.5.3 Final

Подробнее здесь: https://stackoverflow.com/questions/791 ... pa-queries
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»