Spring Data Rest Association GET Override

问题描述 投票:1回答:1

好的,这个问题的答案可能在春季文档herehere,但我一直无法找到它。我正在尝试实现软删除。到目前为止,这一切都很好,花花公子。除非我通过协会获得记录。

示例:http://localhost:8080/api/accounts返回一个正确的帐户列表(不显示任何帐户,其中is_deleted = true)

http://localhost:8080/api/addresses返回一个正确的地址列表(没有显示is_deleted = true的任何地址)

但当我点击http://localhost:8080/api/accounts/3c84cdb1-6a01-4364-a60b-305afc521440/addresses时,我得到了所有地址的列表。甚至那些is_deleted = true

这是我的自定义baseRepository:


@NoRepositoryBean
public interface BaseRepository<T extends BaseEntity, ID> extends JpaRepository<T,ID>{
    void obliterateEntity(T entity);


    @Override
    @Transactional(readOnly = true)
    @Query("select e from #{#entityName} e where e.isDeleted = false")
    Page<T> findAll(Pageable pageable);

    @Override
    @Transactional(readOnly = true)
    @RestResource(exported=false)
    @Query("select e from #{#entityName} e where e.isDeleted = false")
    List<T> findAll(Sort var1);

    @Override
    @Transactional(readOnly = true)
    @RestResource(exported=false)
    @Query("select e from #{#entityName} e where e.isDeleted = false")
    List<T> findAllById(Iterable<ID> var1);

    @Override
    @Transactional(readOnly = true)
    @RestResource(exported=false)
    @Query("select e from #{#entityName} e where e.isDeleted = false")
    List<T> findAll();

    @Override
    @Transactional(readOnly = true)
    @RestResource(exported=false)
    @Query("select e from #{#entityName} e where e.isDeleted = false and e.id = ?1")
    Optional<T> findById(ID var1);

    @Query("update #{#entityName} e set e.isDeleted=true where e.id = ?1")
    @Transactional
    @Modifying
    void delete(UUID id);

    @Override
    @Transactional
    default void delete(T entity) {
        delete(entity.getId());
    }
}

问题:当通过关联链接获取时,我需要覆盖哪些方法来过滤已删除的记录?

附:我也试过这样做而不是覆盖函数:

@SQLDelete(sql =
        "UPDATE address " +
                "SET is_deleted = true " +
                "WHERE id = ?")
@Loader(namedQuery = "findAddressById")
@NamedQuery(name= "findAddressById", query =
        "SELECT add " +
                "FROM Address add " +
                "WHERE " +
                "add.id = ?1 AND " +
                "add.isDeleted = false")
@Where(clause = "is_deleted = false")
public class Address extends BaseEntity {

但这需要在每个实体中完成同样的事情。它还有其他实现问题。

我想我只是在做软删除时遇到了麻烦。所以,任何额外的建议将不胜感激。

hibernate spring-boot jpa spring-data spring-data-rest
1个回答
1
投票

您需要在关联上添加@Where

public class Account extends BaseEntity {

    @OneToMany
    @Where(clause = "is_deleted = false")
    private Set<Address> addresses;
}

你添加到@WhereAddress只会对直接加载地址产生影响(考虑到你定义的加载数据的查询,这似乎是多余的)。

见第4节:

https://www.baeldung.com/hibernate-dynamic-mapping

© www.soinside.com 2019 - 2024. All rights reserved.