Solucionado (ver solução)
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!!

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