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

Erro forEach

Galera, ao interar uma table com o forEach, esta trazendo dados repetidos, porem no banco de dados nas tabelas nao existe dados repetidos...

Controller:

    @RequestMapping("listarAtletas")
    public ModelAndView listaAtletas() {
        ModelAndView mv = new ModelAndView("listaAtletas");
        Iterable<Atleta> atletas = atletaRepository.findAll();
        Iterable<AtletaDocumento> atletasDocumentos = adr.findAll();
        mv.addObject("atletas", atletas);
        mv.addObject("atletasDocumentos", atletasDocumentos);
        return mv;
    }

Models:

@Entity
public class AtletaDocumento {

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

    @ManyToOne
    private Atleta atleta;
    private String tipoDocumento;
    private String numeroDocumento;

    public Atleta getAtleta() {
        return atleta;
    }
    public void setAtleta(Atleta atleta) {
        this.atleta = atleta;
    }
    public String getTipoDocumento() {
        return tipoDocumento;
    }
    public void setTipoDocumento(String tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }
    public String getNumeroDocumento() {
        return numeroDocumento;
    }
    public void setNumeroDocumento(String numeroDocumento) {
        this.numeroDocumento = numeroDocumento;
    }



}

JSP:

<main>
    <h2>Lista de Atletas</h2>
        <table class="table table-bordered">
            <tr>
                <td>Nome</td>
                <td>Data Nascimento</td>
                <td>Tipo Deficiencia</td>
                <td>Modalidade</td>
                <td>Tipo Documento</td>
                <td>Numero Documento</td>
                <td>Deletar</td>
                <td>Alterar</td>
            </tr>

            <c:forEach items="${atletas}" var="atletas">
                <tr>
                    <td>${atletas.nome}</td>
                    <td>${atletas.dataNascimento}</td>
                    <td>${atletas.tipoDeficiencia}</td>
                    <td>${atletas.modalidade}</td>
                    <c:forEach items="${atletasDocumentos}" var="atletasDocumentos">
                        <td>${atletasDocumentos.tipoDocumento}</td>
                        <td>${atletasDocumentos.numeroDocumento}</td>
                    </c:forEach>
<%--                     <td><a href="excluirAtleta?id=${atletas.id}">Remover</a></td> --%>
<%--                     <td><a    href="mostrarAtleta?id=${atletas.id}">Alterar</a></td> --%>
                </tr>
            </c:forEach>
        </table>
    </main>

Bom, como nao consigo postar como ficou a table, nao sei se conseguiram entender... Porem se queria uma dica pra esta jsp, talvez esteja algo errado na hora de interar o for...

6 respostas

Fala ai Bruno, tranquilo ?

Pra mim faz sentido o atleta saber seus documentos e você exibi-los diretamente na tela.

Da forma que você tá fazendo, ele deve estar provavelmente mostrando todos os documentos para cada atleta, correto?

Sim " no banco possuem 3 documentos, cm o id de cada atleta vinculado..."

Porem na view, are mostra os 3 documentos, porem repeti os 3 documentos e repeti tbm os atletas...

solução!

Oi Bruno, tudo certo? O problema é que você está disponibilizando toda a lista de documentos para a jsp e no segundo <c:forEach> está apresentando todos estes dados, repetidamente, para cada atleta.

Imagino que você queira apresentar apenas os documentos de cada atleta. Para isso, altere seu segundo <c:forEach> para:

<c:forEach items="${atletas.atletaDocumentos}" var="atletasDocumentos">
    <td>${atletasDocumentos.tipoDocumento}</td>
    <td>${atletasDocumentos.numeroDocumento}</td>
</c:forEach>

considerando que sua classe Atleta possui uma lista de documentos chamada de atletaDocumentos. ${atletas.atletaDocumentos}vai chamar o métodogetAtletaDocumentos()da classeAtleta`.

Veja se funciona assim

Realizei alteração Thais, e apresentou este erro:

'${atletas.atletaDocumentos}' Property [atletaDocumentos] not found on type [com.atletasCPB.model.Atleta]

Models:

@Entity
public class Atleta {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String nome;
    private String dataNascimento;
    private String tipoDeficiencia;
    private String modalidade;

    @OneToMany(mappedBy = "atleta")
    private List<AtletaDocumento> atletaDocumento;

    public List<AtletaDocumento> getAtletaDocumento() {
        return atletaDocumento;
    }

    public void setAtletaDocumento(List<AtletaDocumento> atletaDocumento) {
        this.atletaDocumento = atletaDocumento;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

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

    public String getDataNascimento() {
        return dataNascimento;
    }

    public void setDataNascimento(String dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public String getTipoDeficiencia() {
        return tipoDeficiencia;
    }

    public void setTipoDeficiencia(String tipoDeficiencia) {
        this.tipoDeficiencia = tipoDeficiencia;
    }

    public String getModalidade() {
        return modalidade;
    }

    public void setModalidade(String modalidade) {
        this.modalidade = modalidade;
    }

}
@Entity
public class AtletaDocumento {

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

    @ManyToOne
    private Atleta atleta;
    private String tipoDocumento;
    private String numeroDocumento;

    public Atleta getAtleta() {
        return atleta;
    }
    public void setAtleta(Atleta atleta) {
        this.atleta = atleta;
    }
    public String getTipoDocumento() {
        return tipoDocumento;
    }
    public void setTipoDocumento(String tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }
    public String getNumeroDocumento() {
        return numeroDocumento;
    }
    public void setNumeroDocumento(String numeroDocumento) {
        this.numeroDocumento = numeroDocumento;
    }    

}

Thais, conseguir resolver, apenas retirei do plural... ao inves de atletaDocumentos... ( atletaDocumento) ... deu certo, mais uma vez salvando, obrigado !

Boa, Bruno!