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.
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…
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;
}
}
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
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)…
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?