Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
14
respostas

Dúvida - Listar Produtos

olá, por favor,

Há algum outro método de criar a query para conseguir listar? no meu projeto pessoal é sobre a classe aluno e tabela aluno.

no meu DAO está:

public List listar() { return manager.createQuery("select from aluno ", Aluno.class).getResultList(); }

O seguinte erro ocorre:

HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: aluno is not mapped [select from aluno ]

Obrigada!!!

14 respostas

Olá, aparentemente é um erro com o seu servidor interno, está tudo configurado corretamente?

Ou pode mostrar como tá a classe Aluno?

Tente fazer o select assim: "select aluno from Aluno aluno"

olá, desde que criei o ModelAndView, comecei a perceber que até o cadastro não está sendo realizado. Não consegui demonstrar a lista. O POM.xml está configurado.

Obrigada.

Segue os códigos

segue Aluno.java

package br.com.projeto.cuidandodaatencao.model;


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

@Entity
public class Aluno {    

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) /* Id para o banco de dados */
    private int Id;

    private long matricula;
    private String senha;
    private String nome;
    private int idade;
    private int serie;
    private char sexo;
    private int jogos;
    private float mediapontuacao;
    private int pontuacaototal;

    public long getMatricula() {
        return matricula;
    }
    public void setMatricula(long matricula) {
        this.matricula = matricula;
    }
    public String getSenha() {
        return senha;
    }
    public void setSenha(String senha) {
        this.senha = senha;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public int getIdade() {
        return idade;
    }
    public void setIdade(int idade) {
        this.idade = idade;
    }
    public int getSerie() {
        return serie;
    }
    public void setSerie(int serie) {
        this.serie = serie;
    }
    public char getSexo() {
        return sexo;
    }
    public void setSexo(char sexo) {
        this.sexo = sexo;
    }
    public int getJogos() {
        return jogos;
    }
    public void setJogos(int jogos) {
        this.jogos = jogos;
    }
    public float getMediapontuacao() {
        return mediapontuacao;
    }
    public void setMediapontuacao(float mediapontuacao) {
        this.mediapontuacao = mediapontuacao;
    }
    public int getPontuacaototal() {
        return pontuacaototal;
    }
    public void setPontuacaototal(int pontuacaototal) {
        this.pontuacaototal = pontuacaototal;
    }
    @Override
    public String toString() {
        return "Aluno [matricula=" + matricula + ", senha=" + senha + ", nome=" + nome + ", idade=" + idade + ", serie="
                + serie + ", sexo=" + sexo + ", jogos=" + jogos + ", mediapontuacao=" + mediapontuacao
                + ", pontuacaototal=" + pontuacaototal + "]";
    }


}

AlunoDAO.java

package br.com.projeto.cuidandodaatencao.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.projeto.cuidandodaatencao.model.Aluno;

@Repository /* guardar os dados */
@Transactional  /* vai cuidar da transação */
public class AlunoDAO {

        @PersistenceContext
        private EntityManager manager;

        public void gravar(Aluno aluno) {
            manager.persist(aluno);
        }

        public List<Aluno> listar() {
            return manager.createQuery("select aluno from Aluno aluno", Aluno.class).getResultList();
        }

    }

AlunoController.java


package br.com.projeto.cuidandodaatencao.controllers;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import br.com.projeto.cuidandodaatencao.dao.AlunoDAO;
import br.com.projeto.cuidandodaatencao.model.Aluno;

@RequestMapping("projeto")
@Controller
public class AlunoController {

    @Autowired /* spring ejetar o DAO */
    private AlunoDAO alunoDAO; 

    @RequestMapping("CadastroAluno")
    public ModelAndView form(){
        ModelAndView modelAndView = new ModelAndView("projeto/CadastroAluno");

    return modelAndView;

    }

    @RequestMapping(method=RequestMethod.POST)
     public String gravar(Aluno aluno, RedirectAttributes redirectAttributes) {
       alunoDAO.gravar(aluno);

       redirectAttributes.addFlashAttribute("sucesso", "Produto cadastrado com sucesso!");            

            return("redirect:projeto");
        }

       @RequestMapping(method=RequestMethod.GET)
        public ModelAndView listar() {
           List<Aluno> alunos = alunoDAO.listar();
           ModelAndView modelAndView = new ModelAndView("projeto/ListaDeAlunos");
          modelAndView.addObject("alunos", alunos);

            return modelAndView;
        }
}

ListaDeAlunos.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cuidando da Atenção</title>
</head>
<body>
    <h1>Lista de Alunos</h1>
    <div> ${sucesso}</div>
    <table>
        <tr>
            <td>Nome</td>
            <td>Idade</td>
            <td>Serie</td>
        </tr>

        <c:forEach items="${alunos}" var="aluno">
            <tr>
                <td>${alunos.nome}</td>
                <td>${alunos.idade}</td>
                <td>${alunos.serie}</td>
            </tr> 
        </c:forEach>
    </table>
</body>
</html>

Olá Lilian,

quando você tenta adicionar ele chega a dar alguma Exception? Poderia mandar a jsp do cadastro também, por favor?

Algumas coisas que podem estar causando problemas no código. Na sua classe Aluno estão faltando os métodos get e set do Id para que o Hibernate consiga trabalhar com esta informação do Aluno.

Além disso, no <c:forEach> do ListaDeAlunos.jsp, dentro das <td> você está chamando por ${alunos...}. No entanto, o alunos é a lista toda e aqui você quer pegar a informação de cada aluno. No <c:forEach> você definiu que cada aluno será colocado no var="aluno", ou seja, para mostrar o nome, idade e serie basta chamar usando aluno ao invés de alunos.

olá, eu corrigi os itens do ListaDeAlunos.jsp e consegui fazer a lista aparecer.

tb inseri o getter e setter do Id

para o cadastro não aparece nenhuma exception

insiro o link http://localhost:8080/projetocuidandodaatencao/projeto/CadastroAluno

os forms aparecem, eu insiro os dados e não grava no banco e o link continua o mesmo, eu abri outro tópico sobre redirect,

a lista de alunos só aparece com o link: http://localhost:8080/projetocuidandodaatencao/projeto

a lista não aparece com o link abaixo:

http://localhost:8080/projetocuidandodaatencao/projeto/ListaDeAlunos

obrigada!

Olá Lilian,

primeiro com relação a dúvida que você levantou com os links. Nesse momento do curso com o Spring, paramos de acessar diretamente a jsp.

Por exemplo, para acessa o formulário de cadastro você acessou o link http://localhost:8080/projetocuidandodaatencao/projeto/CadastroAluno. O que aconteceu é que o Spring, a partir desse link, procurou um Controller cujo mapeamento é projeto/CadastraAluno. Agora olha como está o controller que você mandou na mensagem anterior:

@RequestMapping("projeto")
@Controller
public class AlunoController {

    @Autowired /* spring ejetar o DAO */
    private AlunoDAO alunoDAO; 

    @RequestMapping("CadastroAluno")
    public ModelAndView form(){
        ModelAndView modelAndView = new ModelAndView("projeto/CadastroAluno");
        return modelAndView;
    }
}

A sua classe está com um mapeamento (RequestMapping) para o endereço projeto, enquanto o método form está mapeado para CadastraAluno. Ou seja, quando o usuário digita o endereço projeto/CadastraAluno no navegador, o Spring na verdade está executando o método form do AlunoController. Neste método, você definiu um objeto ModelAndView para o "projeto/CadastroAluno" e retorna este objeto. Este ModelAndView é que define qual a jsp que será devolvida para o navegador do usuário.

Então quando digitamos a url no navegador, passamos o endereço de um método do Controller que queremos acessar. Esse método que se encarrega de executar a lógica e dizer qual a jsp que será usada.

Analogamente, esta é a razão do porque você não consegue acessar a listagem por http://localhost:8080/projetocuidandodaatencao/projeto/ListaDeAlunos. O Spring no fundo estaria procurando por um método do Controller mapeado para o endereço projeto/ListaDeAlunos e não pela ListaDeAlunos.jsp direto. Só que no controller está assim:

@RequestMapping("projeto")
@Controller
public class AlunoController {

    @RequestMapping(method=RequestMethod.GET)
    public ModelAndView listar() {
        List<Aluno> alunos = alunoDAO.listar();
        ModelAndView modelAndView = new ModelAndView("projeto/ListaDeAlunos");
        modelAndView.addObject("alunos", alunos);

        return modelAndView;
    }
}

Sua classe está mapeada para projeto e seu método listar está apenas definido para o tipo GET, sem nenhuma url. Ou seja, o método listar é executando quando o usuário acessa o endereço /projeto no tipo de requisição GET. Isto é justamente o que acontece quando você digita no navegador o link http://localhost:8080/projetocuidandodaatencao/projeto. Ai sim, dentro do método listar foi definido o ModelAndView para a jsp ListaDeAlunos.

Por fim, o motivo de talvez não estar funcionando o cadastro. O Controller para esta etapa está assim:

@RequestMapping("projeto")
@Controller
public class AlunoController {

    @RequestMapping(method=RequestMethod.POST)
    public String gravar(Aluno aluno, RedirectAttributes redirectAttributes) {
            alunoDAO.gravar(aluno);

            redirectAttributes.addFlashAttribute("sucesso", "Produto cadastrado com sucesso!");            

            return("redirect:projeto");
        }
}

Assim a classe está mapeada para o endereço projeto e o método gravar para o tipo de requisição POST. Ou seja, este método será executado apenas quando acessamos a url /projeto no tipo POST. A sua tag <form>na jsp de cadastro está com a action apontando para este endereço projeto e tem como method definido para POST?

Olá Lucas,

abaixo está o código do CadastroAluno.jsp onde demonstra qual o endereço da action e está com o method: POST

obrigada pela ajuda

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cuidando da Atenção</title>
</head>
<body>
    <form action="/projetocuidandodaatencao/projeto/CadastroAluno" method="POST">
       <div>
            <label>Matricula</label>
            <input type="text" name="matricula">
        </div>
        <div>
            <label>Nome do Aluno</label>
            <input type="text" name="nome">
        </div>

        <div>
            <label>senha</label>
            <input type="text" name="senha">
        </div>

         <div>
            <label>idade</label>
            <input type="text" name="idade">
        </div>

         <div>
            <label>serie atual</label>
            <input type="text" name="serie">
        </div>

         <div>
            <label>sexo</label>
            <input type="text" name="sexo">
        </div>


        <button type="submit">
            Cadastrar
        </button>
    </form>
</body>
</html>

Então, note que sua action está apontando para /projetocuidandodaatencao/projeto/CadastroAluno. Baseado no mapeamento das urls que o Spring faz comentado antes, note que ele no fundo procura um método de Controller mapeado para este endereço. Neste caso, é o método form de AlunoController que está mapeado para a url projeto/CadastroAluno:

@RequestMapping("projeto") //Mapeamento da classe para a url /projeto. Vale para todos os métodos nesta classe
@Controller
public class AlunoController {

    @RequestMapping("CadastroAluno") //Mapeamento do método para a url /projeto/CadastroAluno
    public ModelAndView form(){
        ModelAndView modelAndView = new ModelAndView("projeto/CadastroAluno"); //Define que vai retornar projeto/CadastroAluno.jsp para o navegador
        return modelAndView;
    }
}

Mas quando o usuário clicar no botão de Cadastrar ele não quer acessar o formulário novamente, ele quer guardar a informação no banco e voltar para a lista. O método que faz isso é o gravar do AlunoController, que está assim:

@RequestMapping("projeto") //Mapeamento da classe para a url /projeto. Vale para todos os métodos nesta classe
@Controller
public class AlunoController {

    @RequestMapping(method=RequestMethod.POST) //Mapeamento do método tipo POST, mas como não tem nenhuma String de url é apenas /projeto
    public String gravar(Aluno aluno, RedirectAttributes redirectAttributes) {
        alunoDAO.gravar(aluno);
        redirectAttributes.addFlashAttribute("sucesso", "Produto cadastrado com sucesso!");            
        return("redirect:projeto"); //Redireciona para a url /projeto
    }
}

Ou seja, seu mapeamento @ResquestMapping define que para você chamar o método gravar a url que deve ser chamada é apenas projeto e o tipo de requisisção POST. Então é só passar no seu action apenas projeto ao invés de /projetocuidandodaatencao/projeto/CadastroAluno que ele vai chamar o método gravar do AlunoController

Olá Lucas,

mudei o caminho da action para somente "projeto" porém acontece os passos abaixo:

ao acessar o link: http://localhost:8080/projetocuidandodaatencao/projeto/CadastroAluno

entra no formulário, insiro as informações e clico em cadastrar e aparece o link: http://localhost:8080/projetocuidandodaatencao/projeto/projeto

dando o erro: HTTP Status 404 -

Não está cadastrando...

obrigada pela ajuda, mais não sei o que pode ser....já vi diversas vezes as aulas....

Olá Lilian,

como você passou o action? Para ele bater no endereço certo (que seria http://localhost:8080/projetocuidandodaatencao/projeto) ele deveria ser apenas action="projeto".

Olá Lucas, eu alterei somente para "projeto" conforme abaixo, quando tentei cadastrar redirecionou conforme eu expliquei no post acima.

obrigada.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cuidando da Atenção</title>
</head>
<body>
    <form action="projeto" method="POST">
       <div>
            <label>Matricula</label>
            <input type="text" name="matricula">
        </div>
        <div>
            <label>Nome do Aluno</label>
            <input type="text" name="nome">
        </div>

        <div>
            <label>senha</label>
            <input type="text" name="senha">
        </div>

         <div>
            <label>idade</label>
            <input type="text" name="idade">
        </div>

         <div>
            <label>serie atual</label>
            <input type="text" name="serie">
        </div>

         <div>
            <label>sexo</label>
            <input type="text" name="sexo">
        </div>


        <button type="submit">
            Cadastrar
        </button>
    </form>
</body>
</html>

Olá Lilian,

desculpa, me escapou um detalhe. Para chegar no formulário você está digitando assim http://localhost:8080/projetocuidandodaatencao/projeto/CadastroAluno. Quando você passa o action="projeto" (sem a / antes) ele está usando como contexto da aplicação o endereço http://localhost:8080/projetocuidandodaatencao/projeto. Então o que ele faz é bater nesse endereço com o action="projeto" no fim, ou seja, em http://localhost:8080/projetocuidandodaatencao/projeto/projeto.

Quando você passa no action uma barra / no começo da action, ele volta até a raiz de qual máquina você está acessando, ou seja, http://localhost:8080. Então se colocar action="/projeto" o endereço final onde ele vai bater é http://localhost:8080/projeto. Mas neste caso faltou o contexto projetocuidandodaatencao. Então se você passar action="/projetocuidandodaatencao/projeto" ai sim ele vai pingar em http://localhost:8080/projetocuidandodaatencao/projeto

Olá Lucas,

deu certo o cadastro do aluno e o redirecionamento da pagina.

sem querer abusar muito de sua ajuda, poderia me auxiliar em mais uma coisa?:

para o meu projeto pessoal, eu tinha criado o cadastro do Aluno, instituição e professor e agora eu criei a listagem.

tentei da mesma forma para os três e claro, deu exception de ambiguos mapping, tem algo que posso fazer pra deixar a listagem e o cadastro do professor e instituição igual a do aluno?

obrigada pela ajuda!! está me auxiliando no meu aprendizado e me ajudando muito!! =)

solução!

Oi Lilian, tudo bem?

Mapeamento ambíguo é quando você possui a mesma URL para dois mapeamentos.

No seu caso, você deve estar deixando as URL's da listagem de instituição e professor igual a de Aluno. Mas de alguma forma precisa ser diferente.

Troce o que @RequestMapping do AlunosController para:

@RequestMapping("alunos")
@Controller
public class AlunosController {
  // código continua normal dentro da classe.
}

Com isso, tudo que hoje usa projeto você vai mudar para alunos, inclusive no action="alunos" do cadastro do formulário, bem como no redirect após cadastrar return "redirect:alunos".

Nos outros controllers você irá usar os devidos nomes, exemplo:

@RequestMapping("professores")
@Controller
public class ProfessoresController {
  // código continua normal dentro da classe.
}

E também para Instituição:

@RequestMapping("instituicao")
@Controller
public class InstituicaoController {
  // código continua normal dentro da classe.
}

Assim, você não deverá ter problemas de mapeamento.

Sucesso no projeto. Abraço.

Consegui!! muito obrigada pela ajuda!!!

tão ajudando muito!! obrigada mesmo!!