Java 如何通过考试;“过滤器”;对象到spring数据jpa存储库以创建查询

Java 如何通过考试;“过滤器”;对象到spring数据jpa存储库以创建查询,java,spring,spring-data-jpa,Java,Spring,Spring Data Jpa,我需要将一个对象传递给spring引导端点(在@RequestBody中),并使用该对象使用spring数据jpa查询数据库 我的班级 @Entity(name = "PESSOA") public class Pessoa { private Long codigo; private String nome; private String cpf; private String estadoCivil; private LocalDate dataNascimento; @Id @Gene

我需要将一个对象传递给spring引导端点(在@RequestBody中),并使用该对象使用spring数据jpa查询数据库

我的班级

@Entity(name = "PESSOA")
public class Pessoa {

private Long codigo;
private String nome;
private String cpf;
private String estadoCivil;
private LocalDate dataNascimento;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getCodigo() {
    return codigo;
}

@Column
public String getNome() {
    return nome;
}

@Column
public String getCpf() {
    return cpf;
}

@Column
public String getEstadoCivil() {
    return estadoCivil;
}

@Column
public LocalDate getDataNascimento() {
    return dataNascimento;
}

public void setCpf(String cpf) {
    this.cpf = cpf;
}

public void setEstadoCivil(String estadoCivil) {
    this.estadoCivil = estadoCivil;
}

public void setDataNascimento(LocalDate dataNascimento) {
    this.dataNascimento = dataNascimento;
}

public void setCodigo(Long codigo) {
    this.codigo = codigo;
}

public void setNome(String nome) {
    this.nome = nome;
}

}
这是包含我的端点的类:

@RestController
public class PessoaService {

@Autowired
private PessoaRepository pessoaRepository;

@GetMapping("/pessoa")
public List<Pessoa> all() {
    return pessoaRepository.findAll();
}


@GetMapping("/pessoa/{id}")
public Pessoa get(@PathVariable Long id) {
    return pessoaRepository.findById(id).get();
}

@PostMapping("/pessoa")
public Pessoa create(@RequestBody Pessoa pessoa) {
    return pessoaRepository.saveAndFlush(pessoa);
}

@PutMapping("/pessoa/{id}")
public Pessoa update(@PathVariable Long id, @RequestBody Pessoa pessoa) {
    Pessoa pessoaExistente = pessoaRepository.findById(id).get();
    BeanUtils.copyProperties(pessoa, pessoaExistente);
    return pessoaRepository.saveAndFlush(pessoaExistente);
}

@DeleteMapping("/pessoa/{id}")
public Pessoa delete(@PathVariable Long id) {
    Pessoa pessoaExistente = pessoaRepository.findById(id).get();
    pessoaRepository.delete(pessoaExistente);
    return pessoaExistente;
}

}
@RestController
公共类PessoaService{
@自动连线
私人储蓄储蓄;
@GetMapping(“/pessoa”)
公共列表全部(){
return pessoaRepository.findAll();
}
@GetMapping(“/pessoa/{id}”)
public-Pessoa-get(@PathVariable-Long-id){
返回pessoaRepository.findById(id.get();
}
@后映射(“/pessoa”)
公共Pessoa创建(@RequestBody Pessoa Pessoa){
返回pessoaRepository.saveAndFlush(pessoa);
}
@PutMapping(“/pessoa/{id}”)
公共Pessoa更新(@PathVariable Long id,@RequestBody Pessoa Pessoa){
Pessoa pessoaExistente=pessoaRepository.findById(id.get();
复制属性(pessoa、pessoaExistente);
返回PESSOAepository.saveAndFlush(PESSOAeExistente);
}
@DeleteMapping(“/pessoa/{id}”)
public Pessoa delete(@PathVariable Long id){
Pessoa pessoaExistente=pessoaRepository.findById(id.get();
pessoaepository.delete(pessoaExistente);
返回pessoaExistente;
}
}
这是我的存储库:

@Repository
public interface PessoaRepository extends JpaRepository<Pessoa, Long> {

}
@存储库
公共接口PessoaRepository扩展了JpaRepository{
}
有一种方法可以创建如下内容:

@GetMapping("/pessoa")
public List<Pessoa> filter(@RequestBody PessoaFilter filter) {
    return pessoaRepository.findByFilter(filter);
}
@GetMapping(“/pessoa”)
公共列表筛选器(@RequestBody PessoaFilter筛选器){
返回pessoaRepository.findByFilter(过滤器);
}

Spring数据提供了一些可以像过滤器一样使用的东西?

您可以使用规范来实现这一点。看

一旦您向存储库添加了一个接受方法过滤版本的接口,您调用的PessoaFilter将作为谓词传递到查询方法中

实现此接口:

public interface Specification<T> {
    Predicate toPredicate(Root<T> root, CriteriaQuery query, CriteriaBuilder cb);
}
同一篇文章接着描述了另一种方法,使用它可以避免创建生成谓词的代码的麻烦。将querydsl插件添加到pom.xml并使用querydsl谓词执行器扩展存储库接口后,您可以编写以下内容

List<Pessoa> p = pessoaRepo.findAll(pessoa.cpf.eq("asdf"));
List p=pessoaRepo.findAll(pessoa.cpf.eq(“asdf”);
pessoaRepo.findAll(PessoaSpecifications.byCpf("asdf"));
List<Pessoa> p = pessoaRepo.findAll(pessoa.cpf.eq("asdf"));