gpt4 book ai didi

java - 如何将 "filter"对象传递给 spring 数据 jpa 存储库以创建查询

转载 作者:行者123 更新时间:2023-12-03 23:15:19 25 4
gpt4 key购买 nike

我需要将一个对象传递给 spring boot 端点(在@RequestBody 中)并使用该对象通过 spring data jpa 查询数据库。

我的类(class)

@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;
}

}

这是我的仓库:

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

}

有一种方法可以创建如下内容:

@GetMapping("/pessoa")
public List<Pessoa> filter(@RequestBody PessoaFilter filter) {
return pessoaRepository.findByFilter(filter);
}

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

最佳答案

您可以使用规范来做到这一点。参见 this tutorial on Spring's blog .

一旦您将接口(interface)添加到接受方法过滤版本的存储库中,您调用的 PessoaFilter 就会作为谓词传递到查询方法中。

实现这个接口(interface):

public interface Specification<T> {
Predicate toPredicate(Root<T> root, CriteriaQuery query, CriteriaBuilder cb);
}

可以像这样在这里实现:

public interface PessoaSpecifications {

static <Pessoa> Specification<Pessoa> byCpf(String someCpf) {
return new Specification<Pessoa> {
public Predicate toPredicate(Root<Pessoa> root, CriteriaQuery query, CriteriaBuilder cb) {
return cb.equal(root.get(Customer_.cpf), someCpf);
}
};
}
}

并使您的存储库扩展 JpaSpecificationExecutor 以及它之前扩展的任何内容。您将能够将您的规范传递到查询中:

pessoaRepo.findAll(PessoaSpecifications.byCpf("asdf"));

同一篇文章继续描述使用 Querydsl 执行此操作的替代方法这避免了创建生成谓词的代码的麻烦。一旦你将 querydsl 插件添加到你的 pom.xml 并使用 QueryDslPredicateExecutor 扩展你的存储库接口(interface),你就可以编写类似的东西

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

关于java - 如何将 "filter"对象传递给 spring 数据 jpa 存储库以创建查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52102335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com