Hibernate, listar camopo boolean como Sim ou Não, ao invés de true, false [resolvido]

16 respostas
G

Estou quebrando a cabeça pra resolver isso.

Eu tenho minha classe de mapeamento Hibernate, que funciona corretamente. Eu uso um bean controller e um helper para fornecer dados para uma lista, que monto na minha página em JSF.

Na tabela em questão, existe um campo isAdministrador tipo boolean, que na listagem aparece sempre como true ou false. Eu quero que este campo apareça na minha lista como Sim ou Não.

entidade hibernate:

@Entity
@Table(name="usuario"
    ,catalog="intranetditlanta"
)
public class Usuario  implements java.io.Serializable {
     private Integer usuarioId;
     private String nome;
     private String usuario;
     private String senha;
     private boolean isAdministrador;
     private Date horasSemana;
     private Date horasMes;
     //private Set horariousuarios = new HashSet(0);
     //private Set pontos = new HashSet(0);
     //private Set folgas = new HashSet(0);

    public Usuario() {
    }

	
    public Usuario(String nome, String usuario, String senha, boolean isAdministrador) {
        this.nome = nome;
        this.usuario = usuario;
        this.senha = senha;
        this.isAdministrador = isAdministrador;
    }
    public Usuario(String nome, String usuario, String senha, boolean isAdministrador, Date horasSemana, Date horasMes) {
       this.nome = nome;
       this.usuario = usuario;
       this.senha = senha;
       this.isAdministrador = isAdministrador;
       this.horasSemana = horasSemana;
       this.horasMes = horasMes;
       //this.horariousuarios = horariousuarios;
       //this.pontos = pontos;
       //this.folgas = folgas;
    }
   
     @Id @GeneratedValue(strategy=IDENTITY)
    
    @Column(name="usuarioId", unique=true, nullable=false)
    public Integer getUsuarioId() {
        return this.usuarioId;
    }
    
    public void setUsuarioId(Integer usuarioId) {
        this.usuarioId = usuarioId;
    }
    
    @Column(name="nome", nullable=false, length=45)
    public String getNome() {
        return this.nome;
    }
    
    public void setNome(String nome) {
        this.nome = nome;
    }
    
    @Column(name="usuario", nullable=false, length=16)
    public String getUsuario() {
        return this.usuario;
    }
    
    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }
    
    @Column(name="senha", nullable=false, length=32)
    public String getSenha() {
        return this.senha;
    }
    
    public void setSenha(String senha) {
        this.senha = senha;
    }
    
    @Column(name="isAdministrador", nullable=false)
    public boolean isIsAdministrador() {
        return this.isAdministrador;
    }
    
    public void setIsAdministrador(boolean isAdministrador) {
        this.isAdministrador = isAdministrador;
    }
    
    
    @Temporal(TemporalType.TIME)
    @Column(name="horasSemana", length=8)
    public Date getHorasSemana() {
        return this.horasSemana;
    }
    
    public void setHorasSemana(Date horasSemana) {
        this.horasSemana = horasSemana;
    }
    @Temporal(TemporalType.TIME)
    @Column(name="horasMes", length=8)
    public Date getHorasMes() {
        return this.horasMes;
    }
    
    public void setHorasMes(Date horasMes) {
        this.horasMes = horasMes;
    }

usuario helper

public class UsuarioHelper {

    Session session = null;

    public UsuarioHelper() {
        this.session = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    public List getUsuarioNomes(int pageNumber, int pageSize) {
        List<Usuario> usuarioList = null;
        try {
            org.hibernate.Transaction tx = session.beginTransaction();
            //Query q = session.createQuery("from Usuario as usuario where usuario.usuarioId between '" + startID + "' and '" + endID + "'");
            Query q = session.createQuery("from Usuario");
            q.setFirstResult((pageNumber - 1) * pageSize);
            q.setMaxResults(pageSize);

            usuarioList = (List<Usuario>) q.list();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return usuarioList;
    }

    public Usuario getUsuarioByID(int usuarioId) {

        Usuario usuario = null;

        try {
            org.hibernate.Transaction tx = session.beginTransaction();
            Query q = session.createQuery("from Usuario as usuario where usuario.usuarioId=" + usuarioId);
            usuario = (Usuario) q.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return usuario;
    }
}

usuarioController

@ManagedBean
@SessionScoped
public class UsuarioController {

    int pageNumber;
    DataModel usuarioNomes;
    UsuarioHelper helper;
    private int recordCount = 6;
    private int pageSize = 5;
    private Usuario current;
    private int selectedItemIndex;

    public UsuarioController() {
        helper = new UsuarioHelper();
        pageNumber = 1;
    }

    public UsuarioController(int pageNumber) {
        helper = new UsuarioHelper();
        this.pageNumber = pageNumber;
    }

    public Usuario getSelected() {
        if (current == null) {
            current = new Usuario();
            selectedItemIndex = -1;
        }
        return current;
    }

    public DataModel getUsuarioNomes() {
        if (usuarioNomes == null) {
            usuarioNomes = new ListDataModel(helper.getUsuarioNomes(pageNumber, pageSize));
        }
        return usuarioNomes;
    }

    void recreateModel() {
        usuarioNomes = null;
    }

    public boolean isHasNextPage() {
        if (pageNumber  * pageSize < recordCount) {
            return true;
        }
        return false;
    }

    public boolean isHasPreviousPage() {
        if (pageNumber > 1) {
            return true;
        }
        return false;
    }

    public String next() {
        pageNumber += 1;
        recreateModel();
        return "index";
    }

    public String previous() {
        pageNumber -=  1;
        recreateModel();
        return "index";
    }

    public int getPageSize() {
        return pageSize;
    }
    
    public int getPageNumber(){
        return pageNumber;
    }

    public String prepareView() {
        current = (Usuario) getUsuarioNomes().getRowData();
        return "browse";
    }

    public String prepareList() {
        recreateModel();
        return "index";
    }

jsf que faz a listagem dos items

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core">
    
    <ui:composition template="./template.xhtml">
        <ui:define name="body">
            <h:form>
                <h:commandLink action="#{usuarioController.previous}" value="Previous #{usuarioController.pageSize}" rendered="#{usuarioController.hasPreviousPage}"/>
                <h:commandLink action="#{usuarioController.next}" value="Next #{usuarioController.pageSize}" rendered="#{usuarioController.hasNextPage}"/>
                <br/>
                &lt;h:outputText value="#{usuarioController.pageNumber}"/&gt;

                &lt;h:dataTable value="#{usuarioController.usuarioNomes}" var="item" border="0" cellpadding="2" cellspacing="0" rowClasses="jsfcrud_odd_row,jsfcrud_even_row" rules="all" style="border:solid 1px"&gt;
                    &lt;h:column&gt;
                        &lt;f:facet name="header"&gt;
                            &lt;h:outputText value="Nome"/&gt;
                        &lt;/f:facet&gt;
                        &lt;h:outputText value="#{item.nome}"/&gt;
                    &lt;/h:column&gt;
                    &lt;h:column&gt;
                        &lt;f:facet name="header"&gt;
                            &lt;h:outputText value="Usuário"/&gt;
                        &lt;/f:facet&gt;
                        &lt;h:outputText value="#{item.usuario}"/&gt;
                    &lt;/h:column&gt;
                    &lt;h:column&gt;
                        &lt;f:facet name="header"&gt;
                            &lt;h:outputText value="Administrador"/&gt;
                        &lt;/f:facet&gt;
                        &lt;h:outputText value="#{item.isAdministrador}"/&gt;
                    &lt;/h:column&gt;
                    &lt;h:column&gt;
                        &lt;f:facet name="header"&gt;
                            &lt;h:outputText value=" "/&gt;
                        &lt;/f:facet&gt;
                        &lt;h:commandLink action="#{usuarioController.prepareView}" value="View"/&gt;
                    &lt;/h:column&gt;
                &lt;/h:dataTable&gt;
                <br/>
            &lt;/h:form&gt;
        &lt;/ui:define&gt;
    &lt;/ui:composition&gt;
&lt;/html&gt;

16 Respostas

R

Bom dia,

tenta fazer um teste:

if( fulano == true ){ fulano = "Sim"; } else { fulano = "Não"; }

at

I

Bom, eu normalmente faço esses campos, que seriam um boolean mas que eu preciso mostrar pro cliente como SIM/NAO de duas formas.

1 - Quando eu mesmo estou implementando ou fazendo a analise, crio um Enum com os valores SIM/NAO funcionando como true/false.

2 - Se o banco já está criado e eu não posso alterar o tipo de dado, eu crio um método por exemplo getSimNao com uma regra de trazer o SIM pra true e NAO pra false, mais ou menos assim

public String getSimNao(){ if (isAdministrador()){ return "SIM"; } else { return "NAO"; } }

pra mostrar só fazer

<h:outputText value="#{item.simNao}"/> //sem o get pois é nomenclatura padrão, o jsf já vai saber buscar o getSimNao
I

railonpereira:
Bom dia,

tenta fazer um teste:

if( fulano == true ){ fulano = "Sim"; } else { fulano = "Não"; }

at

Dessa forma não daria pq se “fulano” é um atributo do tipo boolean ele não aceitaria receber uma String no lugar.

PS: Só pra aplicar boas práticas de programação, ao comparar um boolean não é necessário fazer

if (fulano == true) if (fulano == false)

basta fazer

if (fulano) if (!fulano)

H

Define um método assim no seu bean:

String getFlagAdmin(){
   if(this.isAdministrador){
      return "Sim";
   }
   return "Não";
}

E na sua página:

&lt;h:outputText value="#{item.flagAdmin}"/&gt;

Abs. :wink:

R

Olá

tem razão igor_Henrique porque boolean no banco é do tipo tinyint e recebe 0 ou 1

valeu por consertar o meu erro.

at

R

henriqueluz:
Define um método assim no seu bean:

String getFlagAdmin(){
   if(this.isAdministrador){
      return "Sim";
   }
   return "Não";
}

E na sua página:

&lt;h:outputText value="#{item.flagAdmin}"/&gt;

Abs. ;)

Perfeito

R

Ok, Dia a Dia nos estamos aprendendo.

H

Eu faria assim:

&lt;h:outputText value="#{item.isAdministrador ? 'Sim' : 'Não'}"/&gt;

Espero ter ajudado.

R

henriquejhc:
Eu faria assim:

&lt;h:outputText value="#{item.isAdministrador ? 'Sim' : 'Não'}"/&gt;

Espero ter ajudado.

Pode ser … mas é certo deixar sua lógica na área de visão ?

H

Sim, você tem razão. Toda lógica deve ser tirada da view, mas particularmente nesse caso não vejo problema em fazer assim.
Eu criaria um método na minha classe Usuario somente se tivesse algo mais complexo.

R

henriquejhc:
Sim, você tem razão. Toda lógica deve ser tirada da view, mas particularmente nesse caso não vejo problema em fazer assim.
Eu criaria um método na minha classe Usuario somente se tivesse algo mais complexo.

Exatamente, eu também faria como você comentou, por isso falei que o exemplo do henriqueluiz era perfeito , ou seja o mais correto. :smiley:

R

Bom dia gianei,

minha sugestão é criar e utilizar um converter. Se surgir outros atributos assim, você pode utilizar o mesmo converter.

Aqui tem um link de como fazer com JBoss Seam que é praticamente igual a somente JSF.
Bem, sabendo que existe, é só pesquisar um pouco que vc vai achar várias fontes de como construir esse converter.

G

[quote=igor_henrique]Bom, eu normalmente faço esses campos, que seriam um boolean mas que eu preciso mostrar pro cliente como SIM/NAO de duas formas.

1 - Quando eu mesmo estou implementando ou fazendo a analise, crio um Enum com os valores SIM/NAO funcionando como true/false.

2 - Se o banco já está criado e eu não posso alterar o tipo de dado, eu crio um método por exemplo getSimNao com uma regra de trazer o SIM pra true e NAO pra false, mais ou menos assim

public String getSimNao(){ if (isAdministrador()){ return "SIM"; } else { return "NAO"; } }

pra mostrar só fazer

<h:outputText value="#{item.simNao}"/> //sem o get pois é nomenclatura padrão, o jsf já vai saber buscar o getSimNao

Obrigado pela ajuda pessoal! Mas não deu certo
Eu coloquei este método descrito acima na minha classe usuario, que é a minha entidade bean. Quando eu coloco este método lá, ocorre um erro e nenhuma página aparece. O erro é causado por isso:
org.hibernate.PropertyNotFoundException: Could not find a setter for property simNao in class lib.Usuario

Eu sei que se isto fosse colocado numa @managedbean, iria funcionar, mas neste caso, quem retorna as informações é a @entity e meu @managedbean é um controller que prepara uma lista com a @entity

Onde exatamente eu coloco o método? talvez isso não funcione dentro da @entity, se não funcionar, esta solução abaixo parece boa, vou tentar fazer:


minha sugestão é criar e utilizar um converter. Se surgir outros atributos assim, você pode utilizar o mesmo converter.

Aqui tem um link de como fazer com JBoss Seam que é praticamente igual a somente JSF.
Bem, sabendo que existe, é só pesquisar um pouco que vc vai achar várias fontes de como construir esse converter.

H

Coloca @Transient em cima do método getSimNao().

G

henriquejhc:
Coloca @Transient em cima do método getSimNao().

Não acreditooooooooo, era tão simples assim! hauhauhauhauhuahu

Valeu cara!!! Tu salvou meu dia, :smiley:

I

Será que rola aquele [RESOLVIDO] la no título do tópico?

Criado 4 de agosto de 2011
Ultima resposta 4 de ago. de 2011
Respostas 16
Participantes 7