Duvida em Critéria

7 respostas
cristianovieira

Olá, analise o seguinte cenário, tenho uma classe Abstrata Pessoa e tenho N classes que extendem ela, como cliente, fornecedor, etc… como segue abaixo:

------------------------------------------------------------------------------------------------------------------------------------------------------------
@Entity
@Table(name="pessoa", schema="public", uniqueConstraints = {@UniqueConstraint(columnNames = {"pess_cpfcnpj", "empe_id"})})
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Pessoa {
------------------------------------------------------------------------------------------------------------------------------------------------------------
@Entity
@Table(name="cliente", schema="public")
public class Cliente extends Pessoa {
------------------------------------------------------------------------------------------------------------------------------------------------------------
@Entity
@Table(name="fornecedor", schema="public")
public class Fornecedor extends Pessoa {
------------------------------------------------------------------------------------------------------------------------------------------------------------

Note que as classes estão em tabelas separadas, usando DAO generico estou montando a parte de pesquisa com critéria, eu gostaria de informar ao critéria qual classe utilizar, estou passando um cliente mas mesmo assim a consulta me retorna fornecedores também.

@SuppressWarnings ({ "unchecked", "finally" })
@Override
public List<Pessoa> filtragem(Pessoa e) {
    Filter f = FactoryFilter.createFilter();
   return (ArrayList<Pessoa>) objDao.filtragem(f);
}

Utilizando o ScannerJPAEntity reparei que existe uma propriedade dentro do Filter chamada de “Representation class” e ele seta Cliente.class. Alguma dica ?

7 Respostas

drsmachado

Qual o problema em postar códigos e colocar entre as tags [code]

cristianovieira

O drsmachado peço desculpas pela postagem dos codigos sem a tag em questão.

drsmachado

Então, por gentileza, corrija o tópico.
Há muitos foristas que não respondem quando a formatação está errada.

Hebert_Coelho

oq o drsmachado falou é verdade.

Eu mesmo, pulo fora.

Só vim falar uma coisa aqui… Eu não consegui entender qual a sua dúvida. [=

cristianovieira

OK os proximos tópicos colocarei o code, ja consegui resolver o problema. Obrigado.

alandiniz

cristianovieira se for possível edite o tópico

se for possível também coloque qual foi seu problema e solução…

Na hora da ajuda o pessoal vem pedir correndo, na hora de postar as respostas os cara pula fora… :frowning:

cristianovieira

Caros, ninguém está pulando fora de nada, não postei a solução por que recebi postagens dizendo que não entenderam a duvida, se não conseguiram entender a duvida provavelmente não iriam entender a solução. Pois bem, venho por meio deste remontar o cenário postar a duvida a solução:

Classes
Pessoa (Abstrata)
cliente (extends Pessoa)
fornecedor (extends Pessoa)

Como estou usando uma estrutura de DAO generico toda e qualquer classe referente a DAO, BO e CONTROLADOR tem a assinatura setando para PESSOA como segue abaixo:

public class PessoaControlador implements IBaseModelo<Pessoa>{

Ou seja, mesmo que no método de consulta eu receber Pessoa e passar um Cliente la na BASEDAO ele identificaria a classe de persistencia via reflection sendo uma pessoa e não um cliente devido a assinatura das classes. Pois bem, ao invés de modificar a estrutura que ja está pronta eu apenas modifiquei o método de consulta da BASEDAO (SuperClass de todas as classes DAO), coloquei o parametro do tipo CLASS então com a modificação ficou da seguinte forma:

public List<T> filtragem(final Filter filter, final Class classePesquisa) {		
		return getHibernateTemplate().executeFind( new HibernateCallback() {
			public Object doInHibernate(Session session) throws HibernateException {	
				Criteria criteria  = HibernateUtils.buildCriteria(filter, session, classePesquisa);							
				return  criteria.list();
			}
		});	
	}

O metodo antigo utilizava uma variavel global que era obtida via reflection no construtor da BASEDAO.
É isso pessoal. Obrigado e desculpem o transtorno.

Criado 3 de fevereiro de 2012
Ultima resposta 3 de fev. de 2012
Respostas 7
Participantes 4