Spring Data中JsonView的替代

时间:2018-07-02 09:59:53

标签: spring spring-boot spring-data-jpa spring-data

@JsonView帮助我动态地过滤掉输出数据中的某些字段。但是在过滤掉所有查询之前,已经执行了。

我想在从数据库中查询字段之前忽略这些字段,以避免对关联表进行不必要的查询。(@JsonIgnore以这种方式工作,但这不是动态的)。请帮帮我

2 个答案:

答案 0 :(得分:0)

对于动态过滤,您可以使用我为杰克逊写的一个小插件:

https://github.com/Antibrumm/jackson-antpathfilter

这应该在发出相关表查询之前开始。

答案 1 :(得分:0)

在某些情况下,我替换JsonView仅用作API返回的数据的过滤器而又不减少数据库查询负载的情况是使用投影和spring数据有很好的支持,下面是一个例子:

使用JsonView

@Data
@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @JsonView(View.NamesOnly.class)
    private String firstName;

    @JsonView(View.NamesOnly.class)
    private String lastName;
}

@GetMapping("/{id}")
@JsonView(View.NamesOnly.class)
public ResponseEntity<Person> findById(@PathVariable Long id) {
    return personRepository.findById(id)
            .map(ResponseEntity::ok)
            .orElse(ResponseEntity.notFound().build());
}

使用投影

public interface NamesOnly {

    String getFirstName();

    String getLastName();
}

@Repository
public interface PersonRepository extends JpaRepository<Person, Long> {

   @Query(" select p from Person p where p.id = :id")
   Optional<NamesOnly> findByIdNames(Long id);
}

@GetMapping(value = "/{id}", params = "projection")
public ResponseEntity<NamesOnly> findByIdNames(@PathVariable Long id) {
    return personRepository.findByIdNames(id)
            .map(ResponseEntity::ok)
            .orElse(ResponseEntity.notFound().build());
}

这是一个完整的示例:https://github.com/pedrobacchini/spring-data-projection