2017-10-17 94 views
0

如何在通过id查询记录时不应用@Where子句以便我可以检索软删除记录?将软删除记录视为已删除,除非通过ID查询

当某个用户被删除时,它会在其删除的字段中存储一个时间戳。我们希望软删除的用户被视为通常删除的记录,除非通过其ID在端点中查询。 (GET/users /:Id)。

当前代码已经解决了查询所有用户时不应该返回已删除记录的要求之一。但是,当通过GET /用户质疑这不返回被软删除的记录/:身份证

实体

@Entity(name = "user") 
@Where(clause = "deleted IS NULL") 
public class User { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(unique = true) 
    private String username; 

    private String password; 

    //getters and setters 
} 

控制器

@RequestMapping(method = RequestMethod.GET) 
public ResponseEntity<PaginatedResponse<User>> getAllUsers(
     Specification<User> spec, 
     @RequestParam(defaultValue = "") String[] sort, 
     @RequestParam(defaultValue = "50") int limit, 
     @RequestParam(defaultValue = "0") int offset) { 

    List<User> allUsers = userService.findAll(spec); 
    List<User> users = userService.findAll(spec, Pageables.with(offset, limit, sort)); 

    return ResponseEntity.ok(new PaginatedResponse<>(allUsers.size(), limit, offset, users)); 
} 

@RequestMapping(value = "/{id}", method = RequestMethod.GET) 
public ResponseEntity<User> getUser(@PathVariable("id") Long userId) { 
    User user = userService.findOne(userId); 
    Objects.requireNonNull(user, "No user with id: " + userId); 
    return ResponseEntity.ok(user); 
} 

public interface UserRepository extends BaseRepository<User> { 
} 


@NoRepositoryBean 
public interface BaseRepository<T> extends JpaRepository<T, Long>, JpaSpecificationExecutor<T> { 
} 

回答

0

我会建议你阅读关于hibernate中的过滤器。在那里你可以有条件,你要么返回用户将删除身份证的或不。 让我分享一下代码。

@Before("@annotation(com.talentica.talentpool.core.applicant.aop.Applicant)") 
public void enableUserFilter() { 
Session session = (Session) entityManager.getDelegate(); 
if (session.isConnected() && yourCondition) { 
    session.enableFilter("userFilter"); 
} 

而应用此对您的用户实体

@FilterDef(name = "userFilter") 
@Filters({ @Filter(name = "userFilter", condition = "is_deleted = null") }) 
public class User implements Serializable { 
} 

可以以这种方式使用它,它必须帮助你。