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

Erro ao fazer consulta com filtros

Estou recriando o projeto para o bytebank.

Ao tentar fazer a consult com filtros, obtive o seguinte erro:

error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-10-22 02:07:48.108 ERROR 20152 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'contaController': Unsatisfied dependency expressed through field 'contaRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'contaRepository' defined in br.com.joao.banco.repository.ContaRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.util.List br.com.joao.banco.repository.ContaRepository.findByClienteNome(java.lang.String)! Reason: Failed to create query for method public abstract java.util.List br.com.joao.banco.repository.ContaRepository.findByClienteNome(java.lang.String)! No property clienteNome found for type Conta!; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.List br.com.joao.banco.repository.ContaRepository.findByClienteNome(java.lang.String)! No property clienteNome found for type Conta!
Aqui estão minhas classes:

package br.com.joao.banco.controller;

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;

import java.util.List;

import br.com.joao.banco.controller.dto.ContaDto; import br.com.joao.banco.modelo.Conta; import br.com.joao.banco.repository.ContaRepository;

@RestController public class ContaController {

@Autowired
private ContaRepository contaRepository;

@RequestMapping("/contas")
public List<ContaDto> lista(String nomeCliente){

    if(nomeCliente == null) {
        List<Conta> contas = contaRepository.findAll();
        return ContaDto.converter(contas);
    } else {
        List<Conta> contas = contaRepository.findByClienteNome(nomeCliente);
        return ContaDto.converter(contas);

    }



}

}

package br.com.joao.banco.repository;

import java.util.List;

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

import br.com.joao.banco.modelo.Conta;

public interface ContaRepository extends JpaRepository<Conta, Long>{

 List<Conta> findByClienteNome(String nomeCliente);

Poderia me ajudar?

4 respostas

Oi João, tudo bem?

Como está o código da sua classe Conta.java?

Pelo erro você não tem um atributo "clienteNome" declarado dentro dessa classe e você está tentando fazer uma consulta utilizando ele pelo nome desse método:

 List<Conta> findByClienteNome(String nomeCliente);

Bom dia, tudo bem?

Aqui está a classe conta:

package br.com.joao.banco.modelo;

import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToOne;

@Entity

public class Conta { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; protected double saldo; private int agencia; private int numero; @OneToOne private Cliente titular;

public void deposita(double valor) {

    this.saldo += valor;

}

public void saca(double valor) throws ExcecaoSaldoInsuficiente {
    if(this.saldo < valor) {

        throw new ExcecaoSaldoInsuficiente("O valor � maior que o saldo. " + "Saldo: " + this.saldo + ", Valor: " + valor);

    } else {

        this.saldo -= valor;
    }
}



public void transfere(double valor, Conta destino) throws ExcecaoSaldoInsuficiente {
    this.saca(valor);
    destino.deposita(valor);
}

public void imprimeExtrato() {

    System.out.println("Titular: " + this.titular.getNome());
    System.out.println("CPF: " + this.titular.getCpf());
    System.out.println("Número: " + this.getNumero());
    System.out.println("Agência: " + this.getAgencia());
    System.out.println("Saldo: " + this.getSaldo());



}

public double getSaldo() {
    return saldo;
}

public void setSaldo(double saldo) {
    this.saldo = saldo;
}

public int getAgencia() {
    return agencia;
}

public void setAgencia(int agencia) {
    this.agencia = agencia;
}

public int getNumero() {
    return numero;
}

public void setNumero(int numero) {
    this.numero = numero;
}

public Cliente getTitular() {
    return titular;
}

public void setTitular(Cliente titular) {
    this.titular = titular;
}

} E também classe Cliente:

package br.com.joao.banco.modelo;

import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id;

@Entity

public class Cliente {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String nome;

private String cpf;


public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public String getCpf() {
    return cpf;
}

public void setCpf(String cpf) {
    this.cpf = cpf;
}

}

solução!

Oi João,

Na sua classe Conta o atributo se chama titular, então o seu método no repository deveria ser:

List<Conta> findByTitularNome(String nomeCliente);

Bons estudos!

Achei que o findby fazia referencia ao nome na classe cliente, muito obrigado Rodrigo

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software