Seleção de colunas com Hibernate

Bom dia amigos…

Eu perguntei algo parecido outro dia, mas não compreendi direito…
Pergunta: Qual é a maneira correta de selecionar valores de colunas?

   Session sessao = HibernateUtility.getSession();

   String hql = "select fdbg.Instituicao, fdbg.Tabela from FacdbGeral as fdbg " +
                     "where fdbg.IdInstituicao = :idInstituicao";

   Query query = sessao.createQuery(hql);
   query.setInteger("idInstituicao", idInstituicao);
   List instituicao = query.list();

   System.out.println(((FacdbGeral)instituicao.get(0)).getInstituicao());

Com código acima, está me retornando, o erro:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object;
        at br.smarapd.facdb.service.FacdbManager.getValores(FacdbManager.java:84)
        at br.smarapd.facdb.gui.FacdbForm.main(FacdbForm.java:47)

Será que estou errando no mapeamento? Alguém pode me ajudar?
Grato!!

Se você der select em uma coluna, ele vai trazer um objeto do tipo mapeado em Java para aquela coluna. Se der select em mais de uma, ele vai trazer um Object[]. Imagino que deu class cast exception por isso, você deve ter tentado colocar em outro tipo. Inclusive no strack trace está Ljava.lang.Object, um Object[]

Entendi !!
Mas é estranho, porque as duas colunas são do mesmo tipo…
Somente o length é diferente…

    <class name="br.empresa.facdb.dao.FacdbGeral" table="FacdbGeral" schema="dbo" catalog="smarxrlaser">
        <id name="IdInstituicao" type="integer">
            <column name="IdInstituicao" />
            <generator class="increment" />
        </id>
        <property name="Instituicao" type="string">
            <column name="Instituicao" length="50" not-null="true" />
        </property>
        <property name="Tabela" type="string">
            <column name="Tabela" length="20" not-null="true" />
        </property>

Na continuação deste mapeamento, têm outras colunas do tipo INT… Será que é isso que interfere?
O Object[] é criado somente com as 2 colunas selecionadas ou com todas do mapeamento?

O select em mais de uma coluna vai trazer um Object[]. Não importa o tipo. A ordem do select vai ser a ordem no array.

[quote] Na continuação deste mapeamento, têm outras colunas do tipo INT… Será que é isso que interfere? [/quote] Eu acho que não. O que eu sei, por experiência própria de uso, quando comecei a usar o hibernate, é isso que te falei, sobre o Object[]. Com relação a tipos diferentes eu não tive problemas.

Legal… Obrigado!
Mas ainda continuo com o problema…
Se alguém tiver outra idéia e puder me ajudar, agradeceria…

Obrigado!

Cara, o que tem nessa linha: at br.smarapd.facdb.service.FacdbManager.getValores(FacdbManager.java:84)? Posta o código desse método/classe.

A classe é bem extensa!!

O metódo era somente aquilo que eu havia passado:

	public void getValores(int idInstituicao) {

		Session sessao = HibernateUtility.getSession();

		String hql = "select fdbg.Instituicao, fdbg.Tabela from FacdbGeral as fdbg " +
		             "where fdbg.IdInstituicao = :idInstituicao";

		Query query = sessao.createQuery(hql);
		query.setInteger("idInstituicao", idInstituicao);
		List instituicao = query.list();

		System.out.println(((FacdbGeral)instituicao.get(0)).getInstituicao());
	}

Este é o Bean:

// Default Package
package br.smarapd.facdb.dao;

import java.util.*;

/**
 * FacDBGeral generated by hbm2java
 */
public class FacdbGeral {

     // Fields     
     ...
     private String Instituicao;
     private String Tabela;
     ...

    // Constructors
    public FacdbGeral() {
    }

    ...
    public String getTabela() {
       return Tabela;
    }

    public void setTabela(String tabela) {
       Tabela = tabela;
    }

    public String getInstituicao() {
	return Instituicao;
    }

    public void setInstituicao(String instituicao) {
        this.Instituicao = instituicao;
    }
    ...
}

E o mapeamento já foi no Post anterior…
Grato pela ajuda!

Beleza, mas o que tem na linha 84? O stack trace diz FacdbManager.java:84.

A última linha do método!

System.out.println(((FacdbGeral)instituicao.get(0)).getInstituicao());

List instituicao = query.list(); System.out.println(((FacdbGeral)instituicao.get(0)).getInstituicao());

Levando em consideração que o hibernate vai trazer um array de object, pois, você deu select especificando os campos, a sua lista instituição vai estar armazenando uma lista de Object[], cada elemento da lista é um Object[]. Quando você dá o cast para FacdbGeral vai dar problema, pois o elemento 0 da lista não é um FacdbGeral.

Muito boa a explicação… Entendi a teoria !!
Mas e na prática, como eu printaria estes valores?

Você vai percorrer a List normalmente, mas cada iteração você terá um objeto Object[] na mão. Cada elemento desse array é um valor de uma coluna do select, na ordem do select.

Excelente… Vou tentar aqui!!
Muito obrigado pelas dicas!!