JPA/Hibernate Criteria, trazendo registros a mais

Boa tarde pessoal, estou com a seguinte dúvida e problema :stuck_out_tongue:

Tenho 2 Entity(Estoque e EstoqueProdutoQuantidade) segue um trecho do código das duas:

@Entity
public class Estoque {

	@Id
	@GeneratedValue(generator="SEQ_ESTOQUE_ID", strategy=GenerationType.SEQUENCE)
	@SequenceGenerator(sequenceName="SEQ_ESTOQUE_ID", name="SEQ_ESTOQUE_ID", allocationSize=1)
	protected Long id;

	@OneToMany(cascade=CascadeType.ALL, mappedBy="estoque")
	protected List<EstoqueProdutoQuantidade> produtos;
...
}
@Entity
@Table(name="ESTOQUE_PRODUTO_QTD")
public class EstoqueProdutoQuantidade extends ProdutoQuantidade {

	@ManyToOne
	@JoinColumn(name="ID_ESTOQUE")
	protected Estoque estoque;
...
}

E estou fazendo o seguinte criteria:

Criteria criteria = getCriteria();
criteria.createAlias("produtos", "prod");
criteria.add(Restrictions.in("prod.status", new Object[] {EstoqueProdutoStatus.ATIVO, EstoqueProdutoStatus.BLOQUEADO}));
criteria.add(Restrictions.eq("id", id));
criteria.setFetchMode("produtos", FetchMode.SELECT);
criteria.setFetchMode("quantidades", FetchMode.SELECT);
Estoque estoque = (Estoque) criteria.uniqueResult();

No meu banco de dados eu tenho 2 registro de EstoqueProdutoQuantidade com o status indicado no criteria (EstoqueProdutoStatus.ATIVO e EstoqueProdutoStatus.BLOQUEADO), só que ao executar o criteria, ele está montando 2 selects, o primeiro, baseado no meu criteria e trazendo os 2 registros q eu preciso, e um segundo, que é baseado no mapeamento do entity EstoqueProdutoQuantidade com a entity Estoque, e com isso ele está me trazendo os 5 registros de EstoqueProdutoQuantidade que eu tenho no meu banco, não esstou entendendo o pq q ele está executando.

Segue abaixo os selects q ele está executando, o 2 não sei pq está sendo executado!

SELECT est.*
FROM Estoque est, ESTOQUE_PRODUTO_QTD qtd
WHERE est.id = qtd.id_estoque
AND qtd.status in(1, 0)
AND est.id = 2
SELECT qtd.*
FROM ESTOQUE_PRODUTO_QTD qtd
WHERE qtd.id_estoque = 2

Se alguem tiver ideia do que possa ser, e puder me ajuda, agradeço

Muito obrigado.

Para que serve esta linha?

criteria.setFetchMode("quantidades", FetchMode.SELECT); 

[]´s

Opaaa, desculpa, foi coisa a mais na Criteria que eu mandei, segue a que estou tentando executar

criteria.createAlias("produtos", "prod");

criteria.add(Restrictions.in("prod.status", new Object[] {EstoqueProdutoStatus.ATIVO, EstoqueProdutoStatus.BLOQUEADO}));
criteria.add(Restrictions.eq("id", id));

criteria.setFetchMode("produtos", FetchMode.SELECT);

Estoque estoque = (Estoque) criteria.uniqueResult();

É igual a outra que enviei no primeiro post, com a diferença que retirei o ‘criteria.setFetchMode(“quantidades”, FetchMode.SELECT);’

Se alguem já passou por um problema similar e puder ajuda, muito obrigado.

Abraços

tenta adicionar essa linha na sua criteria

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

Porque voce nao usa NamedQuery , seu codigo fica muito mais facil de se dar manutenção.

Criteria é legal voce usar quando por exemplo sua query é dinamica , relatorios e afins no mais aconselho uso de named querys.