Spring 数据休息协会 GET 覆盖
Spring Data Rest Association GET Override
好的,这个问题的答案可能在 spring 文档 here or here 中,但我没能找到。
我正在尝试实施软删除。
到目前为止,一切正常。除非我通过协会获得记录。
示例:
http://localhost:8080/api/accounts
returns 正确的帐户列表(不显示 is_deleted = true 的任何帐户)
和
http://localhost:8080/api/addresses
returns 正确的地址列表(不显示 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());
}
}
问题:
当通过关联链接获取已删除的记录时,我需要重写哪些方法来过滤已删除的记录?
p.s。我也尝试这样做而不是覆盖函数:
@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 {
但这需要在每个实体中完成相同的事情。它还存在其他实施问题。
我想我只是在进行软删除时遇到了问题。因此,如有任何额外建议,我们将不胜感激。
您需要在关联中添加 @Where
。
public class Account extends BaseEntity {
@OneToMany
@Where(clause = "is_deleted = false")
private Set<Address> addresses;
}
您添加到 Address
的 @Where
只会对直接加载地址产生影响(考虑到您定义的加载数据的查询,这似乎是多余的)。
参见第 4 节:
好的,这个问题的答案可能在 spring 文档 here or here 中,但我没能找到。 我正在尝试实施软删除。 到目前为止,一切正常。除非我通过协会获得记录。
示例:
http://localhost:8080/api/accounts
returns 正确的帐户列表(不显示 is_deleted = true 的任何帐户)
和
http://localhost:8080/api/addresses
returns 正确的地址列表(不显示 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());
}
}
问题: 当通过关联链接获取已删除的记录时,我需要重写哪些方法来过滤已删除的记录?
p.s。我也尝试这样做而不是覆盖函数:
@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 {
但这需要在每个实体中完成相同的事情。它还存在其他实施问题。
我想我只是在进行软删除时遇到了问题。因此,如有任何额外建议,我们将不胜感激。
您需要在关联中添加 @Where
。
public class Account extends BaseEntity {
@OneToMany
@Where(clause = "is_deleted = false")
private Set<Address> addresses;
}
您添加到 Address
的 @Where
只会对直接加载地址产生影响(考虑到您定义的加载数据的查询,这似乎是多余的)。
参见第 4 节: