Erro de Query no hibernate Usuario is not mapped

Pessoal, estou fazendo um login com jsf e hibernate e estorou o seguinte erro

Stack Trace

javax.servlet.ServletException: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Usuario is not mapped [SELECT u from Usuario u where u.nome = :nome and u.senha = :senha]
javax.faces.webapp.FacesServlet.service(FacesServlet.java:671)

A minha Query está assim:

public Usuario getUser(String nome, String senha) {
	try {
		String jpql = "SELECT u from Usuario u where u.nome = :nome and u.senha = :senha";
		
		Usuario usuario = (Usuario) manager.createQuery(jpql, Usuario.class)
			.setParameter("nome", nome)
			.setParameter("senha", senha).getSingleResult();
		
		return usuario;
	} catch (NoResultException e) {
		return null;
	}
}

E o nome do Usuario está em maiúsculo mesmo, pesquisei bastante e ainda não encontrei uma solução, sendo que eu tenho uma query que está quase do mesmo jeito para listar os usuarios, está como SELECT u from Usuario u e funciona perfeitamente, gostaria de uma ajuda, obrigado desde já

O erro diz que Usuário não está mapeado! Vc precisa de uma classe Usuário q represente sua tabela, se tiver posta o código dela, mas FORMATADO.

1 curtida

Ou a classe usuário não contém a anotação @Entity ou não está no arquivo .hbm.xml ou você não a está referenciando no persistence.xml ou você não está dizendo ao JPA que deve descobrir as entidades automaticamente.

Eu mudei a String e fiz assim
SELECT u from "+Usuario.class.getName()+" u where u.nome = :name and u.senha = :senha

Deu mais ou menos certo, só que mudou o erro, agora fala que

javax.servlet.ServletException: java.lang.IllegalArgumentException: Parameter with that name [name] did not exist

o método ficou assim

	public Usuario getUsuario(String nome, String senha) {
		try {
			Usuario usuario = (Usuario) manager
					.createQuery("SELECT u from "+Usuario.class.getName()+" u where u.nome = :name and u.senha = :senha")
					.setParameter("name", nome)
					.setParameter("senha", senha).getSingleResult();
			return usuario;
		} catch (NoResultException e) {
			return null;
		}
	}

Não cara.

  1. Novamente não é um código formatado. Selecione o código e USE o botão < / > pra formatar.
  2. Cadê a classe Usuario???

Modelo do usuário !
e foi mal, não sabia usar o negócio de formatar antes

@Entity
public class Usuario {
	
	@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	
	@Column(name="userName", nullable=false, unique=true)
	private String nome;
	@Column(name="email", unique = true)
	private String email;
	@Column(name="password", nullable=false, unique=false)
	private String senha;
	
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}

JPQLs de outras entidades funcionam?

Sim, tenho cruds com esse usuario funcionando e que tem esse select

Tenho esse List, que funciona perfeitamente

public List<Usuario> listar() {
		String jpql = "select u from Usuario u";
		return manager.createQuery(jpql, Usuario.class).getResultList();
	}

Então n faz sentido funcionar em um lugar mas em outro sim.
Verifica os imports se estão igual ao lugar que funciona. Principalmente o import da classe Usuario, se é a correta.

Esse List também está dentro do Dao do usuário, os imports são os mesmos, realmente não faz nenhum sentido

Posta a DAO completa ai.
O método q n funciona é de validação de login? Não estarias criando a factory apenas depois do login?

Usuario Dao
Tá um pouco diferente o método da validação sem os setParam aí por que estou testando de outras maneiras .-.

public class UsuarioDao {
	private EntityManagerFactory factory = Persistence
            .createEntityManagerFactory("pizzaria-dev");
	
	@PersistenceContext
	private EntityManager manager = factory.createEntityManager();
	
	public Usuario getUsuario(String nome, String senha) {
		try {
			Usuario usuario = (Usuario) manager
					.createQuery("select u from "+Usuario.class.getName()+" u where u.nome = "+nome+" and u.senha = :"+senha)
					.getSingleResult();
			return usuario;
		} catch (NoResultException e) {
			return null;
		}
	}
	public void cadastrar(Usuario usuario) {
		manager.persist(usuario);
	}
	
	public List<Usuario> listar() {
		String jpql = "select u from Usuario u";
		return manager.createQuery(jpql, Usuario.class).getResultList();
	}
	@Transactional
	public void deletar(Usuario usuario) {
		manager.remove(manager.getReference(Usuario.class, usuario.getId()));
	}
	
	@Transactional
	public void editar(Usuario usuario) {
	manager.merge(usuario);
	manager.flush();
	}
	
	 
	
	
}

Isso vc pode desfazer, deixa só Usuario

Beleza, mas se eu deixar só Usuario aí volta a dar o erro que não acha a Entity

Sim, mas d qualquer jeito está com erro e deve funcionar com Usuario. Vc pode ter piorado e n avançado.
Chessuis, pelo amor de Deus, tira a concatenação da JPQL:
where u.nome = “+nome+” and u.senha = :"+senha
Usa parametros SEMPRE. Isso ai permite sql injection. :see_no_evil::see_no_evil::see_no_evil:

Beleza kkkk, fiz isso pra testar, e sqlinjection não é tanto um problema agora, que isso é uma atividade de curso
Deixei assim agora

    public Usuario getUsuario(String nome, String senha) {
		try {
			Usuario usuario = (Usuario) manager
					.createQuery("select u from Usuario u where u.nome = :name and u.senha = :senha")
					.setParameter("name", nome)
					.setParameter("senha", senha)
					.getSingleResult();
			return usuario;
		} catch (NoResultException e) {
			return null;
		}
	}

E ele volta o erro

javax.servlet.ServletException: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Usuario is not mapped [select u from Usuario u where u.nome = :name and u.senha = :senha]

Se certifica q neste momento da execução já foram mapeadas as classes.
Ou na mesma execução roda o outro comando q funciona antes deste, só pra testar.

Coloquei o método de listar antes e funcionou perfeitamente

    public List<Usuario> listar() {
		String jpql = "select u from Usuario u";
		return manager.createQuery(jpql, Usuario.class).getResultList();
	}

:thinking: Vê se não é só adicionar o parametro Usuario.class depois da jpql

Fiz isso e continua o erro de Usuario is not Mapped