I'm working on a crud made on spring-boot with java 8, and i want to know how can i filter by a foreign key. Like searching people who live in a determinate city. For example: localhost:8080/people?cityName=LasVegas
I'm using JPA queries to get data in my database
(Pessoa) is my entity class
My Repository:
@Repository
public interface CidadeRepository extends JpaRepository<Cidade, Long> {
@Query("select c from Cidade c where c.nome is null or c.nome like %:filtro% and c.estado is null or c.estado = :filtro")
Page<Cidade> listarPorFiltros(@Param("filtro") CidadeDTO filtro, Pageable pageable);
}
Pessoa Resource:
@GetMapping
public ResponseEntity<Page<PessoaDTO>> listarPessoas(
@ModelAttribute PessoaDTO pessoaDTO, Pageable pageable){
return new ResponseEntity<>(pessoaService.listarPessoas(pessoaDTO, pageable), HttpStatus.OK);
}
PessoaDTO:
@Getter
@Setter
public class PessoaDTO implements Serializable {
private Long id;
private String nome;
private String cpf;
private String apelido;
private String timeCoracao;
private String hobbie;
private CidadeDTO cidadeDTO;
}
cidadeDTO is the fk im trying to filter^^
Pessoa Service:
/*Pesquisar pessoas por nome, cpf ou cidade*/
public Page<PessoaDTO> listarPessoas(PessoaDTO pessoaDTO, Pageable pageable){
Page<PessoaDTO> pessoaPage;
if(pessoaDTO.getNome() != null){
pessoaPage = pessoaRepository.listarPorFiltros(pessoaDTO.getNome(), null, null, pageable).map(pessoaMapper::pessoaParaDTO);;
}else if(pessoaDTO.getCpf() != null){
pessoaPage = pessoaRepository.listarPorFiltros(null, pessoaDTO.getCpf(), null, pageable).map(pessoaMapper::pessoaParaDTO);;
}else if(pessoaDTO.getCidadeDTO().getNome() != null){
pessoaPage = pessoaRepository.listarPorFiltros(null, null, pessoaDTO.getCidadeDTO().getNome(), pageable).map(pessoaMapper::pessoaParaDTO);;
}else{
pessoaPage = pessoaRepository.findAll(pageable).map(pessoaMapper::pessoaParaDTO);
}return pessoaPage;
}
PessoaMapper:
@Component
@Mapper(componentModel = "spring")
public interface PessoaMapper {
@Mapping(source = "cidade", target = "cidadeDTO")
PessoaDTO pessoaParaDTO(Pessoa pessoa);
List<PessoaDTO> pessoaParaDTO(List<Pessoa> pessoa);
Pessoa pessoaDTOParaPessoa(PessoaDTO pessoaDTO);
}
CodePudding user response:
I couldnt filter the cityName because in my "PessoaDTO" there wasnt a variable that represented the cityName, only the city(entity).
So i created a new class, called "SearchPessoaDTO" that contains a String variable to store the cityName. I also changed the Queries to work properly.
My Repository:
@Query("select c from Cidade c where c.nome is not null and c.nome like %:nome% or c.estado is not null and c.estado = :estado")
Page<Cidade> listarPorFiltros(@Param("nome") String nome, @Param("estado") String estado, Pageable pageable);
SearchPessoaDTO:
@Getter
@Setter
public class PessoaDTO implements Serializable {
private String nome;
private String cpf;
private String c_nome;
}
Now if i want to search for people who live in york for example, i make a GET request like this: localhost:8080/api/pessoas?c_nome=York