Problema com Criteria

9 respostas
D

Opa :smiley:

Tenho uma busca de Produtos e quero restringir que soh me listem os produtos daquela empresa. Meu problema esta que a empresa se relaciona com funcionarios e os funcionarios que se relacionam com produtos. Tentei adicionar uma Restriction, mas fiquei com o erro abaixo:

Meu codigo esta da seguinte maneira:

criteria.add(Restrictions.eq("funcionario.empresa", empresa));

O relacionamento esta da seguinte maneira:

1 Empresa - N Funcionarios
1 Funcionario - N Cargas

9 Respostas

ricardosoares

Expressões HQL são case-sensitive.
Veja se ao invés de “funcionario.empresa” não deveria ser “Funcionario.empresa”.

D

nao…pq o Funcionario que eu chamo, eh o atributo ‘funcionario’ do ProdutoBean:

ProdutoBean.java

@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name="id_funcionario", insertable=true, updatable=true)
	@Fetch(FetchMode.JOIN)
	private FuncionarioBean funcionario;

FuncionarioBean.java

@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name="id_empresa", insertable=true, updatable=true)
	@Fetch(FetchMode.JOIN)
	private EmpresaBean empresa;
orlandocn

ja tentou mudar

para

criteria.add(Expression.eq("funcionario.empresa", empresa)); ?

DirceuSobrinho

Você tb pode tentar fazer algo assim:

Criteria criteria = getSession(false).createCriteria(Produto.class);
Criteria c = criteria.createCriteria("funcionario");
c.add(Restrictions.eq("empresa", empresa));
return criteria.list
D

Opa…to chegando la…esses exemplos funcionaram e se eu precisar buscar dentro de 2 Collections?

Tipo, Produto tem a collection Marca e dentro da Marca tem a Modelo…como que faria?

ProdutoBean.java

@OneToMany(mappedBy="produto", fetch=FetchType.LAZY)
	@Cascade({CascadeType.ALL, CascadeType.DELETE_ORPHAN})
	private List<MarcaBean> marcas = new ArrayList<MarcaBean>();

MarcaBean.java

/**
	 * JavaBean CarretaBean
	 */
	@OneToMany(mappedBy="marca", fetch=FetchType.LAZY)
	@Cascade({CascadeType.ALL, CascadeType.DELETE_ORPHAN})
	private List<ModeloBean> modelos = new ArrayList<ModeloBean>();

Como que ficar a criteria para qdo fosse passar uma colecao?

Criteria criteria = session.createCriteria(ProdutoBean.class);
			Criteria c = criteria.createCriteria("marcas");
			c.add(Restrictions.eq("modelos.nome", modelo.getNome()));

Assim nao funciona hehe

Alguem sabe? :smiley:

g4j

Só uma dica: Quando vc coloca “modelos.nome” na restrição, o hibernate vai tentar encontrar um atributo na tua classe com este nome e não vão encontrar.

Talvez seja mais simples usar HQL pra fazer o que vc quer.

D

Mas como vou juntar as 2 colecoes numa HQL?

g4j

Seguindo a descrição do teu modelo:

1 Empresa - N Funcionarios
1 Funcionario - N Cargas

Você deve ter uma classe Empresa com um Set de funcionarios e vc deve ter uma classe Funcionario com um Set de cargas;
Em Carga vc tem um objeto Funcionario que por sua vez tem um objeto Empresa;

Ficaria parecido com isto para listar as cargas de uma empresa:

String hql = "select ca from Carga ca join ca.funcionario fu join fu.empresa em where em.idEmpresa = ... order ...";
von.juliano

davidpadilha:
Opa…to chegando la…esses exemplos funcionaram e se eu precisar buscar dentro de 2 Collections?

Tipo, Produto tem a collection Marca e dentro da Marca tem a Modelo…como que faria?

ProdutoBean.java

@OneToMany(mappedBy="produto", fetch=FetchType.LAZY)
	@Cascade({CascadeType.ALL, CascadeType.DELETE_ORPHAN})
	private List<MarcaBean> marcas = new ArrayList<MarcaBean>();

MarcaBean.java

/**
	 * JavaBean CarretaBean
	 */
	@OneToMany(mappedBy="marca", fetch=FetchType.LAZY)
	@Cascade({CascadeType.ALL, CascadeType.DELETE_ORPHAN})
	private List<ModeloBean> modelos = new ArrayList<ModeloBean>();

Como que ficar a criteria para qdo fosse passar uma colecao?

Criteria criteria = session.createCriteria(ProdutoBean.class);
			Criteria c = criteria.createCriteria("marcas");
			c.add(Restrictions.eq("modelos.nome", modelo.getNome()));

Assim nao funciona hehe

Alguem sabe? :D


Não sei se entendi direito sua dúvida, mas acho que isso resolve:

Criteria criteria = session.createCriteria(ProdutoBean.class); Criteria c1 = criteria.createCriteria("marcas"); Criteria c2 = c1.createCriteria("modelos"); c2.add(Restrictions.eq("nome", modelo.getNome())); c2.list(); Flw! :thumbup:

Criado 25 de agosto de 2008
Ultima resposta 26 de ago. de 2008
Respostas 9
Participantes 6