Gente. Estou precisando da seguinte solução:
Criar um Criteria baseado em outro Criteria. Alguém sabe como poderia fazer isso?
Gente. Estou precisando da seguinte solução:
Criar um Criteria baseado em outro Criteria. Alguém sabe como poderia fazer isso?
Explica melhor isso aí pra poder entender melhor o que você quer fazer…
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?
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?
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() );