Alguem me ajuda com essa consulta, Dao

15 respostas
B

Precisava trazer os dados do meu banco que nao fosse nulo e nao fosse nomes repetidos, os nulos eu consegui mas os nomes repetidos continua trazendo ainda alguem sabe o q faco?

Veja usso essa criteria e ele me retorna os que nao sao nulos correta mente

public ArrayList buscaOsNomes() throws Exception {
        return new ArrayList(dao.getList("from CBean as c where c.nome != '' "));
    }

mas precisava implementar tambem para que nao retornase os nomes repetidos tambem ai tentei isso

public ArrayList buscaOsNomes() throws Exception {
        return new ArrayList(dao.getList("from CBean as c where c.nome != '' and c.nome != c.nome"));
    }

e nao deu certo ele n carrega mais a combobox com essa criteria

Obrigada!

15 Respostas

Andre_Fonseca

oi

tenta fazer assim

B

Primeiramente obrigado por sua atencao amigo, mas poderia ser um pouquinho mais claro pois sou iniciante e nao entendi aonde devo colocar

criteria.setProjection(Projections.distinct("propertyName"));

e tb como instanciar criteria no caso crio esse objeto como? mais uma vez obrigada!

Andre_Fonseca

oi,

como é feito este método dao.getList() vc pode postar o código??

B

Exatamente veja

SessionFactory sessionFactory = new Configuration().configure().buildSesionFactory();
    GenericDAO dao = new GenericDAO(CBean.class, sessionFactory);

    public ArrayList buscaOsNomes() throws Exception {
        //criteria.setProjection(Projections.distinct("propertyName"));
        return new ArrayList(dao.getList("from CBean as c where c.nomes != ''"));
    }
Andre_Fonseca

oi

eu quis dizer o código do método getList da classe GenericDAO

talvez você tenha que criar outro método assim getListWithDistinct(String propertyName).

B

Ops desculpe n tinha prestado atencao ta ai!

public List getList(String query) throws Exception {
        Session session = factory.openSession();
        session.setFlushMode(FlushMode.ALWAYS);
        session.flush();
        List objs = null;
        try {
            objs = session.createQuery(query).list();
        } catch (HibernateException ex) {
            throw ex;
        } finally {
            session.close();
        }
        return objs;
    }

o que devo fazer poderia me ajudar?

Andre_Fonseca

oi

tenta fazer o seguinte - num método separado

public List getListDistinct(String query) throws Exception {  
            Session session = factory.openSession();  
            session
            	.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
            	.setFlushMode(FlushMode.ALWAYS);  
            session.flush();  
            List objs = null;  
            try {  
                objs = session
                         criteria.setProjection(Projections.distinct("propertyName"));
                         .createQuery(query).list();  
            } catch (HibernateException ex) {  
                throw ex;  
           } finally {  
               session.close();  
           }  
           return objs;  
       }
B

Fis da maneira que falo e me deu erro em 4 linhas desse metodo na linha session.setResultTransformer a variavel session nao consegue encontrar o metodo setResultTransformer
no bloco try a linha objs = session tambem esta com erro!
Devo deixar o codigo do jeito que vc me mando mesmo? pq nunca vi uma linha comeca com .(algo) achei estranho e assim mesmo?

try {     
                objs = session   
                         criteria.setProjection(Projections.distinct("propertyName"));   
                         .createQuery(query).list();     
            } catch (HibernateException ex) {     
                throw ex;

Obrigada

Andre_Fonseca

oi

desculpa, eu colei errado, nao tem mais a necessidade do setProjection veja

public List getListDistinct(String query) throws Exception { Session session = factory.openSession(); session .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) .setFlushMode(FlushMode.ALWAYS); session.flush(); List objs = null; try { objs = session .createQuery(query).list(); } catch (HibernateException ex) { throw ex; } finally { session.close(); } return objs; }

B

Certo o numero de linhas com erro caiu para 1 apenas aqui

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

ele fala que nao existe setResultTransformer nao consegue localizar esse metodo! e uma outra duvida depois na minha control devo fazer oq? chamar assim?

public ArrayList buscaOsNomes() throws Exception {
        return new ArrayList(dao.getListDistinct("from CBean as c where c.nome != ''"));
    }

?

Andre_Fonseca
biluquinha:
Certo o numero de linhas com erro caiu para 1 apenas aqui
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

ele fala que nao existe setResultTransformer nao consegue localizar esse metodo! e uma outra duvida depois na minha control devo fazer oq? chamar assim?

public ArrayList buscaOsNomes() throws Exception {
        return new ArrayList(dao.getListDistinct("from CBean as c where c.nome != ''"));
    }

?

oi, me desculpe de novo

editar as coisas na pressa não resolve :D

tenta fazer o seu método assim

public List getListDistinct(String query) throws Exception {  
            Session session = factory.openSession();  
	            session.setFlushMode(FlushMode.ALWAYS);  
	            session.flush();  
	            
	    List objs = null;  
	    try {  
	      objs = session
	      		.createQuery(query)
	      		.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
	      		.list();  
	    } catch (HibernateException ex) {  
	      throw ex;  
	    } finally {  
	      session.close();  
	    }  
           return objs;  
       }

e para charma é só fazer do jeito que vc colocou

public ArrayList buscaOsNomes() throws Exception {
        return new ArrayList(dao.getListDistinct("from CBean as c where c.nome != ''"));
    }
B

Maravilha agora compilo certinho mas quando carrego la pra ver se funcionou simplesmente traz os registro repetidos ainda!!! nao esta faltando isso ?

.setProjection(Projections.distinct("propertyName"));

n e isso que define que nao ira ter nomes repetidos? pq n metodo que vc me passo vc tirou isso! enfim em qual linha define que nao pode trazer registros repetidos? obrigada mais uma vez!

Andre_Fonseca

oi

o setProjections funcionaria se você estivesse criando um criteria, mas no seu caso você está fazendo um .createQuery(query) direto do session.

o tópico que mostra isso está aqui

uma outra alternativa é você retornar um LinkedHashSet ao invés de uma lista, isso porque um Set remove automaticamente os registros duplicados, no proprio tópico mostra isso

estou meio sem tempo agora, depois eu posso te ajudar melhor…

t+

B

Dei uma boa olhada la mas teve muita coisa que nao entendi,
tipo aqui

Criteria criteria = session.createCriteria(Permissao.class) no lugar de Permissao.class o que devo por? meu bean?
fico no aguardo obrigada!

Andre_Fonseca

oi

no seu caso você teria que alterar o seu dao genérico para ao invés de receber uma string - query sql - ele deveria receber por exemplo o seu bean

eu acho melhor a segunda opção

dá uma procurada no forum, tem vários tópicos discutindo

tem outros tb

http://www.urubatan.com.br/dao-generico-um-exemplo-a-pedidos/

dá uma pesquisada e veja o que você acha, se tiver mais dúvidas posta aqui :slight_smile:

Criado 21 de setembro de 2009
Ultima resposta 21 de set. de 2009
Respostas 15
Participantes 2