Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Fazer um Get usando os dados de uma query (por exemplo com Where)

Só foram exemplificados casos com GET ou PUT usando o id, como faço usando uma query? Por exemplo, vamos supor que preciso listar todos os médicos que tem o nome "João", ou seja, como elaboro um GET utilizando as condições da query: SELECT * FROM medicos WHERE nome LIKE '%João%'; ???

8 respostas

Olá, Eudermes!

No repository basta você criar um método seguindo o padrão de nomenclatura do Spring Data JPA:

List<Medico> findByNomeContainingIgnoreCase(String nome);

E no controller pode ter um método para buscar por nome:

@GetMapping
@RequestMapping("buscarPorNome")
public List<DadosListagemMedico> buscarPorNome(String nome) {
    //chama o metodo do repository passando o parametro nome
}

E então dissparar uma requisição GET. Exemplo: localhost:8080/medicos/buscarPorNome?nome=joao

Espero ter ajudado! Bons estudos!

Primeiramente gostaria de lhe agradecer pela eficiência na resposta, muitíssimo obrigado!!!

Perdoe-me se minha dúvida for muito trivial, mas infelizmente sou novo no Java, estou ainda engatinhando

Eu segui suas recomendações passadas acima, porém estou com dúvida em elaborar o método sugerido no repository:

List findByNomeContainingIgnoreCase(String nome);

Como fica a elaboração deste método?

Muito obrigado!

Oi!

Basta adicionar mais esse método na sua interface MedicoRepository:

public interface MedicoRepository extends JpaRepository<Medico, Long> {
    
    List<Medico> findByNomeContainingIgnoreCase(String nome);


    //outros métodos já existentes continuam...
    
}

Eu orientei como você orientou, já está quase lá rsrsrs...

Agora deu um 404 Not Found

eu acredito que é algum erro nesta implementação que não consegui fazer direito:

@GetMapping @RequestMapping("buscarPorNome") public List buscarPorNome(String nome) { //chama o metodo do repository passando o parametro nome

estou chamando este metódo assim:

return repository.findAll( ).stream( ).map (listagemMedicos::new).tolist( );

// acredito que o erro esteja nesta linha de cima

}

Manda aqui o código completo do seu controller e do seu repository

@RestController
@RequestMapping("/medicos")
public class MedicoController {

    // declara como atributo da classe controller
    @Autowired  // injeção de dependencia
    private MedicoRepository repository;

    @PostMapping  // insere dadosno banco de dados
    @Transactional  // toda vez que modificar o banco de dados precisa usar
    // o @RequestBody é para pegar os dados do corpo da requisição
    // o @Valid é para validar os dados do cadastro
    public void cadastrar (@RequestBody @Valid DadosCadastroMedico dados){

        // o objetivo deste metodo é pegar o repository e persistir ele no banco de dados


        // vai salvar o repository no banco de dados:
        repository.save(new MedicoEntidade(dados));

    }

    @GetMapping
    public List<ListagemMedicos> listar (){


        //ira retornar o que estiver dentro do DTO: Listagem Medicos,
        // o toList é para retornar em uma lista
        return repository.findAll().stream().map( ListagemMedicos::new).toList();

    }

    @PutMapping
    @Transactional
    public void atualizar(@RequestBody @Valid AtualizaMedico dados){

        // vai no banco de dados (através do repository) e traz o medico pelo id
        //e salva na variável "medico"
        var medico=repository.getReferenceById( dados.id() );

        //sobrescreve os dados recebidos na variavel medico
        //atualizaInformações é um metodo da entidadeMedico
        medico.atualizaInformacoes(dados);
    }

    // esta exclusão é definitiva
    // como vai excluir o medico pelo id da url, o metodo fica um pouco diferente
    @DeleteMapping("/{id}")
    @Transactional
    public String excluir(@PathVariable Long id){

        repository.deleteById(id);
        // a resposta do banco de dados (quem é o medico c/ o id da url) vem pelo repository
    return "o médico com o id " + id + " foi excluido com sucesso!";
    }

    @GetMapping
    @RequestMapping("buscarPorNome")

    public List<ListagemMedicos> buscaPorNome(String nome){

        return repository.findAll().stream().map( ListagemMedicos::new).toList();
        
    }
    
}

+++++++++++++++++++++++++REPOSITORY++++++++++++++++++++

package med.voll.api.medico;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;


// os argumentos da interface: o nome da entidade e o tipo do atributo da chave primária (id)
//ela herda todos as características da JpaRepository
public interface MedicoRepository extends JpaRepository<MedicoEntidade, Long> {

    List<MedicoEntidade> findByNomeContainingIgnoreCase(String nome);
}
solução!

É só ajustar a anotação no método do controller, pois não precisa do @RequestMapping que tinha falado antes. E chamar o novo método do repository, ao invés do findAll(). Deixa ele assim:

@GetMapping("buscarPorNome")
public List<ListagemMedicos> buscaPorNome(String nome) {
    return repository.findByNomeContainingIgnoreCase(nome).stream().map( ListagemMedicos::new).toList();
}

Rodrigo!!!

Muitissimo obrigado!!!

Você foi extremamente atencioso e generoso!!!!