Hibernate JSF

Os dados retornados de uma consulta do Hibernate são do tipo List, estava usando antes com SQL um método que retornava dados do tipo Result para preencher um dataTable, como posso fazer isso agora com Hibernate?

O dataTable não aceita List e também não é possível converter List para Result.

Obrigado

Quem lhe disse que list não é suportada pelo dataTable? Todo objeto que suporta ser iterado é aceito pelo dataTable.

:okok:

Estou usando esse código na classe:

    public List getListar() throws HibernateException {
        Session sessao = HibernateUtility.getSession();
        try {
            Query select = sessao.createSQLQuery("from Cidades");
            return select.list();
        } catch (HibernateException he) {
             throw he;            
        } finally {
            sessao.close();
        }
    }

E está apresentando este erro:

javax.servlet.ServletException: javax.servlet.jsp.JspException: javax.faces.el.ReferenceSyntaxException: The "." operator was supplied with an index value of type "java.lang.String" to be applied to a List or array, but that value cannot be converted to an integer.

Na página JSF o código não foi mudando e estava funcionado sem o hibernate, se eu fizer o hibernate mostrar o resultado por System.out.println funciona…

Obrigado pela ajuda…

Com certeza não eh por isso…

ResultSet e List são Collection
que eh necessaria pra montar um dataTable.

o problema eh algum parse de String pra Integer
em algum bloco de codigo seu…

Hummm… afinal ele retorna uma lista de que objeto? Poste o código do seu data table e techos do seu backing bean aí.

:pensativo:

no jsp está assim:

<h:dataTable id="listar" value="#{cidadeSession.listar}" var="dados">
    <h:column>
        <f:facet name="header">
            <h:outputText value="#{msgs.cidadesCidade}"/>
        </f:facet>
        <h:outputText value="#{dados.cidade}"/>
    </h:column>

    <h:column>
        <f:facet name="header">
            <h:outputText value="#{msgs.cidadesUF}"/>
        </f:facet>
        <h:outputText value="#{dados.uf}"/>
    </h:column>                            

    <h:column>
        <f:facet name="header">
            <h:outputText value="#{msgs.cidadesDetalhes}"/>
        </f:facet>
        <h:commandLink value="#{msgs.detalhes}" action="#{cidadeSession.buscar}">
            <f:param name="cidadeID" value="#{dados.cidadeID}"/>
        </h:commandLink>
    </h:column>
</h:dataTable>

E nas classes:

public List getListar() throws HibernateException {
    Session sessao = HibernateUtility.getSession();
    try {
        Query select = sessao.createSQLQuery("SELECT * FROM Cidades");
        return select.list();
    } catch (HibernateException he) {
         throw he;            
    } finally {
        sessao.close();
    }
}
public class HibernateUtility {
    private static SessionFactory factory;
    static {
        try {
            factory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
        } catch (Exception e) {
            e.printStackTrace();
            factory = null;
            }
        }
        public static Session getSession() {
        return factory.openSession();
    }
}
public class CidadeDTO {
    private Integer cidadeID;
    private String cidade, uf;

    //public CidadeDTO() {}
    
//    public CidadeDTO(int cidadeID, String cidade, String uf) {
//        setCidadeID(cidadeID);
//        setCidade(cidade);
//        setUf(uf);
//    }
    
    private SelectItem[] ufOpcoes = {
        new SelectItem("AC"),
        new SelectItem("AL"),
        new SelectItem("AM"),
        new SelectItem("AP"),
        new SelectItem("BA"),
        new SelectItem("CE"),
        new SelectItem("DF"),
        new SelectItem("ES"),
        new SelectItem("GO"),
        new SelectItem("MA"),
        new SelectItem("MG"),
        new SelectItem("MS"),
        new SelectItem("MT"),
        new SelectItem("MT"),
        new SelectItem("PB"),
        new SelectItem("PE"),
        new SelectItem("PI"),
        new SelectItem("PR"),
        new SelectItem("RJ"),
        new SelectItem("RN"),
        new SelectItem("RO"),
        new SelectItem("RR"),
        new SelectItem("RS"),
        new SelectItem("SC"),
        new SelectItem("SE"),
        new SelectItem("SP"),
        new SelectItem("TO")
    };

    public Integer getCidadeID() {
        return cidadeID;
    }

    public void setCidadeID(Integer cidadeID) {
        this.cidadeID = cidadeID;
    }
    
    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    public String getUf() {
        return uf;
    }

    public void setUf(String uf) {
        this.uf = uf;
    }

    public SelectItem[] getUfOpcoes() {
        return ufOpcoes;
    }

    public void setUfOpcoes(SelectItem[] ufOpcoes) {
        this.ufOpcoes = ufOpcoes;
    }
}

Opa,

Use o debug do eclipse para ver ser que esta lista retorna. Porque o problema está neste método que está selecionando aí.

:joia:

Uso o netbeans e debugando os dados são retornados sim, mas não consigo exibir na página JSF…

Quando chega na linha CidadeDTO cidadeDTO = (CidadeDTO) iter.next(); do código abaixo esta dando esse erro: java.lang.ClassCastException: [Ljava.lang.Object;

    public void listarTodos() throws HibernateException {
        Session sessao = HibernateUtility.getSession();
        try {
            Query select = sessao.createSQLQuery("SELECT * FROM Cidades");
            List objetos = select.list();
            for (ListIterator iter = objetos.listIterator(); iter.hasNext() ; ) {
                CidadeDTO cidadeDTO = (CidadeDTO) iter.next();
                Listagem(cidadeDTO);                
            }
        } finally {
            sessao.close();
        }
    }

Se eu colocar assim:

    public void listarTodos() throws HibernateException {
        Session sessao = HibernateUtility.getSession();
        try {
            Query select = sessao.createSQLQuery("SELECT * FROM Cidades");
            List objetos = select.list();
            for (ListIterator iter = objetos.listIterator(); iter.hasNext() ; ) {
                //CidadeDTO cidadeDTO = (CidadeDTO) iter.next();
                //Listagem(cidadeDTO);
                System.out.println(iter.next());
            }
        } finally {
            sessao.close();
        }
    }

Retorna isso, existe 3 registros no BD, parece que não esta conseguindo fazer o CAST para recuperar os dados, o problema acho que nem chega na página JSF, o que estou fazendo errado?

Hibernate: /* dynamic native SQL query */ SELECT * FROM Cidades
[Ljava.lang.Object;@1171b26
[Ljava.lang.Object;@1f78040
[Ljava.lang.Object;@50988

Outra coisa que acontece se eu substituo a linha:

Query select = sessao.createSQLQuery(“SELECT * FROM Cidades”);

por:

Query select = sessao.createQuery(“from Cidades”);

acontece esse erro: Exception in thread “main” org.hibernate.hql.ast.QuerySyntaxException: Cidades is not mapped. [from Cidades]

os xmls estão assim:
CidadeDTO.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="pacotes.bean.CidadeDTO" table="CIDADES">

        <id name="cidadeID" column="CIDADEID">
           <generator class="sequence">
              <param name="sequence">GENCIDADEID</param>
           </generator>
        </id>
        
        <property name="cidade" column="CIDADE" type="string"/>
        <property name="uf" column="UF" type="string"/>    
        
    </class>
</hibernate-mapping>

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">    

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">
            org.hibernate.dialect.FirebirdDialect
        </property>
        <property name="hibernate.connection.lc_ctype">
            ISO8859_1
        </property>
        <property name="hibernate.connection.driver_class">
            <!--org.firebirdsql.pool.FBWrappingDataSource-->
            org.firebirdsql.jdbc.FBDriver
        </property>
        <property name="hibernate.connection.url">
            <!--localhost:/sites/cidades/CIDADES.GDB-->
            jdbc:firebirdsql://localhost:3050/c:/sites/cidades/CIDADES.GDB
        </property>
        <property name="hibernate.connection.username">
            SYSDBA
        </property>
        <property name="hibernate.connection.password">
            masterkey
        </property>       
        
        <!-- Condiguração do c3p0 -->
        <property name="hibernate.c3p0.max_size">10</property>
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="hibernate.c3p0.timeout">5000</property>
        <property name="hibernate.c3p0.max_statements">10</property>
        <property name="hibernate.c3p0.idle_test_period">3000</property>
        <property name="hibernate.c3p0.acquire_increment">2</property>

        <!-- Configurações de debug -->
        <property name="show_sql">true</property>
        <property name="hibernate.generate_statistics">true</property>
        <property name="hibernate.use_sql_comments">true</property>
        <mapping resource="pacotes/bean/CidadeDTO.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

Será que o problema é só no CAST ou tem algum xml que está com problemas também?

Obrigado pela ajuda… espero conseguir utilizar o hibernate!

Ae pessoal, consegui resolver o problema converti para Object[] e depois coloquei numa collection, não sei se essa é a melhor forma de fazer, se além tiver um jeito melho por favor poste aqui, segue abaixo o código, obrigado a todos:

    public Collection getListar() throws HibernateException {
        Collection colListarCidades;
        //Abrindo uma sessão
        Session sessao = HibernateUtility.getSession();
        
        //Iniciando uma transação
        Transaction transaction = sessao.beginTransaction(); 
        
        List result = sessao.createSQLQuery("SELECT * FROM Cidades").list();
        Iterator objetos = result.iterator();

        colListarCidades = new ArrayList();        
        for (int i = 0; i < result.size(); i++) {
            Object[] tuple = (Object[])objetos.next();
            CidadeDTO cidadeDTO = new CidadeDTO();
            cidadeDTO.setCidadeID((Integer)tuple[0]);
            cidadeDTO.setCidade((String)tuple[1]);
            cidadeDTO.setUf((String)tuple[2]);
            colListarCidades.add(cidadeDTO);
        }
        
        //persistente no banco de dados
        transaction.commit(); //Finalizando a transação
        sessao.close(); //Fechando a sessão
        
        return colListarCidades;
    }

Outra coisa estranha é que não consigo usar o createQuery conforme já descrito antes e também tem um campo no BD que é char(2) e não funciona tive que deixar varchar(2)…

faz assim :

ListDataModel saida = new ListDataModel(suaLista);

e retorna um tipo ListDataModel no seu bean.

o dataTable aceita numa boa.

Tentei fazer usando o ListDataModel mas deu o mesmo problema de antes…

Outra coisa estranha é esse médoto:

    public String buscar(int cidadeID) throws CidadesExceptions {
        String result = "FALHA";
        Session sessao = HibernateUtility.getSession();
        try {
            CidadeDTO cidadeDTO = (CidadeDTO)sessao.load(CidadeDTO.class, cidadeID);
            System.out.println("CidadeID: " + cidadeDTO.getCidadeID());
            System.out.println("Cidade: " + cidadeDTO.getCidade());
            System.out.println("UF: " + cidadeDTO.getUf());
            result = "SUCESSO";
        } catch (Exception buscarCidade) {
            result = "FALHA";
            throw new CidadesExceptions(buscarCidade.getClass().getName(),
                "buscarCidade", buscarCidade.getMessage());            
        } finally {
            sessao.close();
        }
        return result;
    } 

Esta imprimindo no console corretamente, porém o JSF não consegue recuperar esses valores na sessão, será que por fazer: Session sessao = HibernateUtility.getSession(); ele perde a sessão, alguém sabe como posso resolver isso?

Obrigado