Gun*_*rim 5 java spring spring-data-jpa
I need to pass an object to a spring boot endpoint (in the @RequestBody) and use that object to query the database using spring data jpa.
My 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;
}
}
Run Code Online (Sandbox Code Playgroud)
This is the class that contains my endpoints:
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
This is my repository:
@Repository
public interface PessoaRepository extends JpaRepository<Pessoa, Long> {
}
Run Code Online (Sandbox Code Playgroud)
There is a way to create something like:
@GetMapping("/pessoa")
public List<Pessoa> filter(@RequestBody PessoaFilter filter) {
return pessoaRepository.findByFilter(filter);
}
Run Code Online (Sandbox Code Playgroud)
Spring data provides something that can be used like a filter?
您可以使用规范来做到这一点。请参阅Spring 博客上的本教程。
一旦您将接口添加到接受该方法的过滤版本的存储库,您调用的 PessoaFilter 就会作为谓词传递到查询方法中。
实现这个接口:
public interface Specification<T> {
Predicate toPredicate(Root<T> root, CriteriaQuery query, CriteriaBuilder cb);
}
Run Code Online (Sandbox Code Playgroud)
可以在这里实现,如:
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);
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
并使您的存储库扩展JpaSpecificationExecutor到它之前扩展的任何内容之外。您将能够将您的规范传递到查询中:
pessoaRepo.findAll(PessoaSpecifications.byCpf("asdf"));
Run Code Online (Sandbox Code Playgroud)
同一篇文章继续描述使用Querydsl执行此操作的替代方法,该方法避免了创建生成谓词的代码的麻烦。将 querydsl 插件添加到 pom.xml 并使用 QueryDslPredicateExecutor 扩展存储库接口后,您可以编写类似的内容
List<Pessoa> p = pessoaRepo.findAll(pessoa.cpf.eq("asdf"));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4623 次 |
| 最近记录: |