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

Query

Bom dia, eu abri um tópico acho que sexta feira, sobre isso mais eu não soube explicar o motivo realmente da minha duvida e que acabou ficando em um assunto que não tinha nada ver. Mais ok, antes eu tinha duvida doque tava acontecendo mais agora tenho certeza aonde está o "erro".

@SuppressWarnings("unused")
    public boolean verificar(Usuario usuario) {
        Query query = manager
                .createQuery("Select u from Usuario u WHERE u.login = :pLogin and u.senha = :pSenha");
        query.setParameter("pLogin", usuario.getLogin());
        query.setParameter("pSenha", usuario.getSenha());
        try {
            Usuario resultado = (Usuario) query.getSingleResult();
        } catch (NoResultException e) {
            return false;
        }
        return true;
    }

Aqui nesse meu select só ira retonar o meu login e senha? porque é oque ta acontecendo. Como seria se fizesse essa comparação com o login e senha na hora da tela do login, mais que trazesse todo o objeto tipo código tipo nele tem um campo boolean e nesse campo só está me retornando false porque só estou passando 2 parameter. Como fazer isso?

9 respostas

Oi Alisson,

Nesse seu select ele retorna o objeto Usuario inteiro mesmo, provavelmente o valor false está sendo retornado pois está assim no BD.

Dá uma conferida no BD e veja onde você poderia ter atualizado esse valor. Se você não atualizou esse valor em nenhum lugar lembre-se que a inicialização padrão do boolean é false mesmo.

Abraço!

Pois então joviane está true no meu banco de dados, alias 1, ou seja true, e eu ja tinha feito o teste, e até meu código ta vindo null, só está me retornando a senha e login quando passo no parameter, pelo menos eu acho que eé isso

    @Transacional
    public String acesso() {
        FacesContext context = FacesContext.getCurrentInstance();
        if (usuarioDao.verificar(usuario)) {
            context.getExternalContext().getSessionMap()
                    .put("usuarioLogado", this.usuario);
            if(usuario.getCodigo() == null ){
                System.out.println("null");
            }
            return RedirecionadorDePaginas.direcao("principal.xhtml");
        } else {
            this.usuario = new Usuario();
            Mensagem.mensagemError("Usuario ou senha incorreto");
            return "";
        }
    }

Aqui até fiz uma verificação e o codigo ta vindo null e está caindo no null

Oi Alisson,

Não deveria não... Como está o seu controller que chama esse método e sua página?

Abraço!

Então por isso que eu to achando estranho também. Está assim o meu controller

@Named
@SessionScoped
@SuppressWarnings("serial")
public class UsuarioBean implements Serializable {

    @Inject
    private Usuario usuario;
    @Inject
    private UsuarioDao usuarioDao;

    @Transacional
    public String acesso() {
        FacesContext context = FacesContext.getCurrentInstance();
        if (usuarioDao.verificar(usuario)) {
            context.getExternalContext().getSessionMap()
                    .put("usuarioLogado", this.usuario);
            return RedirecionadorDePaginas.direcao("principal.xhtml");
        } else {
            this.usuario = new Usuario();
            Mensagem.mensagemError("Usuario ou senha incorreto");
            return "";
        }
    }

    @Transacional
    public void salvar() {
        if (usuario.getCodigo() == null) {
            if (!usuario.getSenha().equals(usuario.getConfirmaSenha())) {
                Mensagem.mensagemError("Senhas incorretas");
            } else {
                usuarioDao.salvar(usuario);
                Mensagem.mensagemInfo("Usuario cadastrado com sucesso");
            }
        } else {

        }
        this.usuario = new Usuario();
    }

    public String sair() {
        FacesContext context = FacesContext.getCurrentInstance();
        context.getExternalContext().getSessionMap().remove("usuarioLogado");
        this.usuario = new Usuario();
        return RedirecionadorDePaginas.direcao("usuario.xhtml");
    }

    public void novo() {
        this.usuario = new Usuario();
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
}

Ahhhh Alisson,

O que acontece é que você só está verificando os dados do usuário mas não está atualizando o valor retornado pela query para o seu usuário...

O seu método verificar deve retornar o usuário encontrado na query para você buscar no seu ManagedBean... É esse usuário encontrado que você precisa atualizar na variável usuario do seu Bean.

Abraço!

Joviane eu mesmo não gosto de pegar código e sim gosta de fazer, mais eu não sei nem por onde começar kkk, no meu metodo verifica devo retornar um usuario? Então ele não vai retornar um boolean né? Poderia me ajudar até nessa parte? Me desculpa :(

solução!

Isso mesmo Alisson,

Você ao invés de retornar boolean, retorna o usuário. Na parte que dá o NoResultException, retorna null.

Aí no bean você verifica se o retorno é diferente de null.

Se não conseguir fazer avisa que coloco o código.

Abraço!

Joviane muito obrigado pela sua dica me ajudo demaaais! obrigado tah? Agora que já rodou oque eu queria, eu queriar melhorar colocar uma tabela de nivel de acesso, é possivel mesmo no select eu fazer um join fetch ou outra tabela né? agora eu me viro daqui pra frente! um forte abraço e pode marcar a sua resposta como a solução! E o meu código fico assim.

@Transacional
    public String acesso() {
        FacesContext context = FacesContext.getCurrentInstance();
        this.usuario = usuarioDao.verificar(usuario);
        if (usuario != null) {
            context.getExternalContext().getSessionMap()
                    .put("usuarioLogado", this.usuario);
            System.out.println("Usuario: " + usuario);
            return RedirecionadorDePaginas.direcao("principal.xhtml");
        } else {
            this.usuario = new Usuario();
            Mensagem.mensagemError("Usuario ou senha incorreto");
            return "";
        }
    }
    public Usuario verificar(Usuario usuario) {
        Query query = manager
                .createQuery("Select u from Usuario u WHERE u.login = :pLogin and u.senha = :pSenha");
        query.setParameter("pLogin", usuario.getLogin());
        query.setParameter("pSenha", usuario.getSenha());
        try {
            Usuario resultado = (Usuario) query.getSingleResult();
            return resultado;
        } catch (NoResultException e) {
            return null;
        }
    }

Opa valeu Alisson!

Qualquer coisa abre uma outra dúvida aí!

Abraço!