Criar Criteria a partir de outra Criteria (Hibernate) [RESOLVIDO]

4 respostas
BiraBoy

Gente. Estou precisando da seguinte solução:

Criar um Criteria baseado em outro Criteria. Alguém sabe como poderia fazer isso?

4 Respostas

L

Explica melhor isso aí pra poder entender melhor o que você quer fazer…

BiraBoy

Desculpe, vou reformular a pergunta:

Eu quero criar duas classes Criteria diferentes (que um não seja referência à outra) com os mesmos filtros. Onde eu crio uma e adiciono todos os filtros e crio outra baseado nessa primeira. Um clone.

Há como fazer isso?

BiraBoy

Bem, graças a uma sugestão no forum hibernate.org soube de uma forma de clonar o objeto Criteria como eu queria:

Fazendo um deep cloning escrevendo para stream e recuperando depois o objeto:

Criteria c = getSession(Clazz.class);
        ByteArrayOutputStream b = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(b);
        out.writeObject(c);
        ByteArrayInputStream bIn = new ByteArrayInputStream(b.toByteArray());
        ObjectInputStream oi = new java.io.ObjectInputStream(bIn);
        Criteria criteriaClone = (Criteria) oi.readObject();

Mas ao executar o “list()”, estava lançando uma NullPointerException. Vendo o fonte da implementação, descobri que ele perde a referência à Sessao hibernate.

Acabei fazendo isso:

( (CriteriaImpl) clonedCriteria).setSession( (SessionImpl)getSession() );

O que expoe a implementação tanto do criteria quanto do session. Alguém tem sugestão ou idéia de como fazer isso sem expor a implementação?

Aliás, qual o risco de expor a implementação dessas classes do hibernate?

BiraBoy

Só para constar.

Na lista de e-mail do JavaRN me deram a seguinte idéia para esconder a implementação do Criteria e do Session:

Criteria c = getSession(Clazz.class);  
    ByteArrayOutputStream b = new ByteArrayOutputStream();  
    ObjectOutputStream out = new ObjectOutputStream(b);  
    out.writeObject(c);  
    ByteArrayInputStream bIn = new ByteArrayInputStream(b.toByteArray());  
    ObjectInputStream oi = new java.io.ObjectInputStream(bIn);  
    Criteria criteriaClone = (Criteria) oi.readObject();
    //Para não mostrar a implementação utilizo o BeanUtils da apache.commons e digo o nome da propriedade que quero setar
    BeanUtils.setProperty(criteriaClone, "session", getSession());

Continua dependendo da implementação, mas pelo menos não a expoe.

Antes eu tinha que fazer isso:

( (CriteriaImpl) clonedCriteria).setSession( (SessionImpl)getSession() );
Criado 20 de novembro de 2007
Ultima resposta 26 de nov. de 2007
Respostas 4
Participantes 2