Home > Blockchain >  How can I filter a search by a fk_name?
How can I filter a search by a fk_name?

Time:02-15

I'm working on a crud made on spring-boot with java 8, and i want to know how can i filter by a fk name. example: localhost:8080/people?cityName=LasVegas

I'm using JPA queries to get data in my database

(Pessoa) is my entity class

My Repository:

import com.celulaweb.crud.domain.Cidade;
import com.celulaweb.crud.service.dto.CidadeDTO;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.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

  • Related