Ajuda busca hibernate (criteria)

6 respostas
Deluxe

Pessoal

tenho a seguinte estrutura

Produto tem 1 tipo de Produto

Minha classe Produto está assim

@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
	@Column(name = "COD_PRODUTO", unique = true, nullable = false, precision = 5, scale = 0)
	private Long codProduto;
	
	@Column(name = "NOME_PRODUTO", nullable = false, length = 100)
	private String nomeProduto;
	
	@Column(name = "DESC_PRODUTO", nullable = true, length = 500)
	private String descProduto;
	
	@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
	@JoinColumn(name="COD_TIPO_PRODUTO", nullable = false)
	private TipoProduto tipoProduto;

e minha classe Tipo Produto está assim

@Id
	@Column(name = "COD_TIPO_PRODUTO", unique = true, nullable = false, precision = 5, scale = 0)
	private Long codTipoProduto;
	
	@Column(name = "NOME_TIPO_PRODUTO", nullable = false, length = 30)
	private String nomeTipoProduto;
	
	@OneToMany (mappedBy="tipoProduto",fetch= FetchType.LAZY)  
	@Cascade (org.hibernate.annotations.CascadeType.ALL)
	private Set<Produto> produto;

Eu preciso fazer uma busca de um produto que tem um tipo X

como fazer pela criteria?

pelo nome do produto estou fazendo assim

session = HibernateUtil.getSession();
			transaction = session.beginTransaction();

			Criteria criteria = session.createCriteria(refClass);
			
			criteria.add(Restrictions.ilike(Produto.NOME_PRODUTO, "%"+produto.getNomeProduto()+"%"));  
			}

mas preciso buscar pelo ID do tipo de Produto
fiz do mesmo jeito para o tipo de produto

criteria.add(Restrictions.eq(TipoProduto.COD_TIPO_PRODUTO, produto.getTipoProduto().getCodTipoProduto()));

Mas da erro pq fala que cod_tipo_produto não é uma propriedade de Produto

eu preciso de uma query feito por criteria assim:

select * from produto where cod_tipo_produto = ?

6 Respostas

P

naõ de deveria ser o atributo do objeto e não da tabela

criteria.add(Restrictions.eq(TipoProduto.codTipoProduto, produto.getTipoProduto().getCodTipoProduto()));
Deluxe

Sim

meu TipoProduto.COD_TIPO_PRODUTO

ele faz o acesso na minha classe

public static final String COD_TIPO_PRODUTO = “codTipoProduto”;

O erro fala que codTipoProduto não é uma propriedade de Produto

Deluxe

alguem ?

bronx

E ae Deluxe!
Cara, é muito simples fazer essa busca através do Criteria!

Saca só:

public Produto getProduto(TipoProduto tipoProduto){
       Criteria criteria = session.createCriteria(Produto.class);
       criteria.add(Restrictions.eq("tipoProduto", tipoProduto));
       Produto produto = (Produto)criteria.uniqueResult();
       return produto;
}

Explicando:
A restrição “eq” (equals) recebe o nome do atributo a ser usado na busca, no caso, “tipoProduto” (definido na tua classe Produto - OO, esqueça modelo relacional). O segundo parâmetro é o objeto que deverá ser comparado com o objeto do primeiro atributo.
Vale lembrar que se você quiser uma lista de produtos com determinado tipo, basta mudar o retorno para List e ao invés de invocar o método uniqueResult(), chame o método list().

***Voltando ao modelo relacional: quando você define uma chave primária, ela já é por definição única e não nula! Logo, alguns parâmetros em tuas anotações são completamente desnecessários! :smiley:

Espero ter ajudado!!!

Kleber-rr

bronx:
E ae Deluxe!
Cara, é muito simples fazer essa busca através do Criteria!

Saca só:

public Produto getProduto(TipoProduto tipoProduto){
       Criteria criteria = session.createCriteria(Produto.class);
       criteria.add(Restrictions.eq("tipoProduto", tipoProduto));
       Produto produto = (Produto)criteria.uniqueResult();
       return produto;
}

Explicando:
A restrição “eq” (equals) recebe o nome do atributo a ser usado na busca, no caso, “tipoProduto” (definido na tua classe Produto - OO, esqueça modelo relacional). O segundo parâmetro é o objeto que deverá ser comparado com o objeto do primeiro atributo.
Vale lembrar que se você quiser uma lista de produtos com determinado tipo, basta mudar o retorno para List e ao invés de invocar o método uniqueResult(), chame o método list().

***Voltando ao modelo relacional: quando você define uma chave primária, ela já é por definição única e não nula! Logo, alguns parâmetros em tuas anotações são completamente desnecessários! :smiley:

Espero ter ajudado!!!

bronx, aproveitando o gancho da dúvida do Deluxe, esse código deve ser implementado aonde?? na minha classe Dao? no meu caso, eu estou usando o hibernate, um banco em postgreSQL e as paginas em JSP. outra coisa: como eu devo fazer essa chamada na minha jsp??

Agradeço man!!!

tonydesign

Kleber-rr:
bronx:
E ae Deluxe!
Cara, é muito simples fazer essa busca através do Criteria!

Saca só:

public Produto getProduto(TipoProduto tipoProduto){
       Criteria criteria = session.createCriteria(Produto.class);
       criteria.add(Restrictions.eq("tipoProduto", tipoProduto));
       Produto produto = (Produto)criteria.uniqueResult();
       return produto;
}

Explicando:
A restrição “eq” (equals) recebe o nome do atributo a ser usado na busca, no caso, “tipoProduto” (definido na tua classe Produto - OO, esqueça modelo relacional). O segundo parâmetro é o objeto que deverá ser comparado com o objeto do primeiro atributo.
Vale lembrar que se você quiser uma lista de produtos com determinado tipo, basta mudar o retorno para List e ao invés de invocar o método uniqueResult(), chame o método list().

***Voltando ao modelo relacional: quando você define uma chave primária, ela já é por definição única e não nula! Logo, alguns parâmetros em tuas anotações são completamente desnecessários! :smiley:

Espero ter ajudado!!!

bronx, aproveitando o gancho da dúvida do Deluxe, esse código deve ser implementado aonde?? na minha classe Dao? no meu caso, eu estou usando o hibernate, um banco em postgreSQL e as paginas em JSP. outra coisa: como eu devo fazer essa chamada na minha jsp??

Agradeço man!!!

Poxa deve ser implementado na classe Dao sim, você deve fazer o chamado no seu servelt “Controle” ou se estiver usando um outro frameworks por exemplo;

Criado 9 de setembro de 2009
Ultima resposta 1 de mar. de 2010
Respostas 6
Participantes 5