[RESOLVIDO] Hibernate+JPA - Transformando sql em hql

Olá a todos,

Minha dúvida é essa, tenho o seguinte SQL, e estou tendo problemas em transforma-lo em hql
para ser usado em uma Query do JPA:

SELECT f.idfornecedor, pe.nome from coliseusys.fornecedor f inner join coliseusys.pessoa pe on(f.idpessoa = pe.idpessoa) inner join coliseuestoque.produto_fornecedor pf on(f.idfornecedor = pf.idfornecedor) inner join coliseuestoque.produto p on(pf.idproduto = p.idproduto) inner join coliseuestoque.item i on(p.idproduto = i.idproduto) where i.iditem = 1 and f.estab = filial.estab

nesse sql acima foi tentado bastante a converção, sem nenhum resultado, de forma que outro foi
feito:

SELECT f.idfornecedor, pe.nome, pe.cnpjf from coliseuestoque.produto_fornecedor pf inner join coliseusys.fornecedor f on(pf.idfornecedor = f.idfornecedor) inner join coliseusys.pessoa pe on(f.idpessoa = pe.idpessoa) inner join coliseuestoque.produto p on(pf.idproduto = p.idproduto) where p.idproduto = (select p2.idproduto from coliseuestoque.item i inner join coliseuestoque.produto p2 on(i.idproduto = p2.idproduto) where i.iditem = 1)

sem sucesso também.
Os dois sqls fazem a mesma coisa, e traz exatamente o resultado de que preciso.
Alguém tem alguma idéia. É possivel transformar qualquer um desses em hql?

Desde já agradeço a atenção.

Não dá. Como você quer transformar uma consulta SQL que retorna colunas de mais de uma tabela em HQL? Sua consulta tem que retornar as colunas de UMA tabela, par que essas colunas possam compor objetos da classe que representam aquela tabela.

[]'s

cara,

fiz mais ou menos ai para vc ter uma ideia, mas qualquer duvida, poste suas entidades.

select f
from Fornecedor f
 join fetch f.pessoa pe
 join f.produtos p
 join p.item i
where i.iditem = 1

t+

olá, david.

uhm, entendido david, a unica coisa é o seguinte

eu preciso que a Query me retorne somente um list de objetos Fornecedores,
e junto com ele vira outro objeto relacionado(Pessoa) com o nome dele, e assim por diante

mais ou menos assim :

[code]public List listaItem(int iditem) {
List list = new ArrayList();

	String hql = "from Item where filial.estab = (:estab) and item.iditem= (:iditem) order by iditem asc";
	try {
		Query query = manager.createQuery(hql);
		query.setParameter("iditem", "iditem");
		query.setParameter("estab", sessionUser.getEstab());
		list = query.getResultList();

	} catch (PersistenceException e) {
		throw new PersistenceException(
				MessageException.persistenceException);
	}

	return list;
}[/code]

desculpa se não expliquei direito.

Olá alisson, vou tentar a sua sugestão, e já te respondo,
obrigado.

Bom alisson, a coisa é um pouco mais complicada ^^

eu preciso de uma list de Fornecedores, tal qual eu falei anteriormente
e a relação entre as entidades é mais ou menos assim:

Fornecedor se relaciona com produto_fornecedors,
sendo idfornecedor FK de produto_fornecedors,
produto_fornecedors se relaciona com Produto
sendo idproduto FK de produto_fornecedors(configurando entre Produto e Fornecedor uma relação Muitos pra Muitos)
Produto se relaciona com Item
sendo idproduto FK em Item

gostaria de saber se tem como eu receber uma lista dos Fornecedores
tendo somente o Iditem de Item, isso através de uma query com hql.
Com o sql fazendo o teste direto la no postgres deu certo
porém não consegui converter

Não coloquei as entidades aqui porque o post ia ficar enorme :stuck_out_tongue:

denovo agradeço a atenção.

cara,

eu preciso ver as suas entedades para te ajudar, pq senao fica dificil, mas que é possivel sim fazer a HQL que vc quer.

t+

beleza cara, na ordem entao:

Fornecedor

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;


@Entity
@Table(name = "fornecedor", schema = "coliseusys")
@SequenceGenerator(name = "coliseusys.gen_idfornecedor", sequenceName = "coliseusys.gen_idfornecedor")
public class Fornecedor implements java.io.Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int idfornecedor;
	...
	private Set<ProdutoFornecedor> produtoFornecedores = new HashSet<ProdutoFornecedor>(0);
	
	

	

	public Fornecedor(int idfornecedor) {
		this.idfornecedor = idfornecedor;
		
	}

	public Fornecedor(int idfornecedor, Set<ProdutoFornecedor> produtoFornecedores) {

		this.idfornecedor = idfornecedor;
		...
		this.produtoFornecedores = produtoFornecedores;
		this.cotacaoforn = cotacaoforn;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "fornecedor")
	public Set<CotacaoForn> getCotacaoforn() {
		return cotacaoforn;
	}

	public void setCotacaoforn(Set<CotacaoForn> cotacaoforn) {
		this.cotacaoforn = cotacaoforn;
	}

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "coliseusys.gen_idfornecedor")
	@Column(name = "idfornecedor", unique = true)
	public int getIdfornecedor() {
		return this.idfornecedor;
	}

	public void setIdfornecedor(int idfornecedor) {
		this.idfornecedor = idfornecedor;
	}

	....

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "fornecedor")	
	public Set<ProdutoFornecedor> getProdutoFornecedores() {
		return produtoFornecedores;
	}

	public void setProdutoFornecedores(Set<ProdutoFornecedor> produtoFornecedores) {
		this.produtoFornecedores = produtoFornecedores;
	}

}

ProdutoFornecedor


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "produto_fornecedor", schema = "coliseuestoque")
public class ProdutoFornecedor implements java.io.Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 679850939067049335L;
	private int idprodutofornecedor;
	private Produto produto;
	private Fornecedor fornecedor;
	private Filial filial;

	

	public ProdutoFornecedor(int idprodutofornecedor, Produto produto,
			Fornecedor fornecedor) {
		this.idprodutofornecedor = idprodutofornecedor;
		this.produto = produto;
		this.fornecedor = fornecedor;
		
	}

	@Id
	@Column(name = "idprodutofornecedor", unique = true)
	public int getIdprodutofornecedor() {
		return this.idprodutofornecedor;
	}

	public void setIdprodutofornecedor(int idprodutofornecedor) {
		this.idprodutofornecedor = idprodutofornecedor;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "idproduto")
	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "idfornecedor")
	public Fornecedor getFornecedor() {
		return fornecedor;
	}

	public void setFornecedor(Fornecedor fornecedor) {
		this.fornecedor = fornecedor;
	}

	
	
}[/code]

[b]Produto[/b]

[code]package br.com.coliseu.model;

// Generated 12/07/2011 13:59:15 by Hibernate Tools 3.4.0.CR1

import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;


@Entity
@Table(name = "produto", schema = "coliseuestoque")
@SequenceGenerator(name = "coliseuestoque.gen_idproduto", sequenceName = "coliseuestoque.gen_idproduto")
public class Produto implements java.io.Serializable {

	/**
	 * 
	 */
	
	private int idproduto;
	....
        private String descricao;
	private Set<ProdutoFornecedor> produtoFornecedors = new HashSet<ProdutoFornecedor>(0);

	
	public Produto(int idproduto, String descricao) {
		this.idproduto = idproduto;
		....
		this.descricao = descricao;
	}

	public Produto(int idproduto,  String descricao, 
                               ....
			Set<ProdutoFornecedor> produtoFornecedors) {
		this.idproduto = idproduto;
		this.descricao = descricao;
		...
		this.produtoFornecedors = produtoFornecedors;

	}

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "coliseuestoque.gen_idproduto")
	@Column(name = "idproduto", unique = true)
	public int getIdproduto() {
		return this.idproduto;
	}

	public void setIdproduto(int idproduto) {
		this.idproduto = idproduto;
	}

	

	@Column(name = "descricao", length = 60)
	public String getDescricao() {
		return this.descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	...


	@OneToMany(fetch = FetchType.LAZY, mappedBy = "produto")
	public Set<ProdutoFornecedor> getProdutoFornecedors() {
		return produtoFornecedors;
	}

	public void setProdutoFornecedors(Set<ProdutoFornecedor> produtoFornecedors) {
		this.produtoFornecedors = produtoFornecedors;
	}
	
	

}

Item


import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.Type;
import org.joda.time.LocalDate;


@Entity
@Table(name = "item", schema = "coliseuestoque")
@SequenceGenerator(name = "coliseuestoque.gen_iditem", sequenceName = "coliseuestoque.gen_iditem")
public class Item implements java.io.Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int iditem;
	private Produto produto;
	private String subdescricao;
	...
        private Set<Itemcotacao> itemcotacoes = new HashSet<Itemcotacao>(0);

	
	public Item(int iditem, Produto produto,
			String subdescricao, ) {
		this.iditem = iditem;
		this.produto = produto;
		this.subdescricao = subdescricao;
		...
	}

	public Item(int iditem, Produto produto,
			String subdescricao, 
                        ...
                        ) {
		this.iditem = iditem;
		this.produto = produto;
		this.subdescricao = subdescricao;
		...
	}

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "coliseuestoque.gen_iditem")
	@Column(name = "iditem", unique = true)
	public int getIditem() {
		return this.iditem;
	}

	public void setIditem(int iditem) {
		this.iditem = iditem;
	}

	...


	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "idproduto")
	public Produto getProduto() {
		return this.produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	

	@Column(name = "subdescricao", length = 40)
	public String getSubdescricao() {
		return this.subdescricao;
	}

	public void setSubdescricao(String subdescricao) {
		this.subdescricao = subdescricao;
	}

	....
}

Dei uma resumida, pra encurtar, deixei as partes relevantes. Veja se consegue alguma coisa.

valeu

Outra coisa, mudamos o sql
para que selecione produto_fornecedor.
Este também, executado no banco funciona
certinho:

SELECT f.idfornecedor, pe.nome, pe.cnpjf from coliseuestoque.produto_fornecedor pf inner join coliseusys.fornecedor f on(pf.idfornecedor = f.idfornecedor) inner join coliseusys.pessoa pe on(f.idpessoa = pe.idpessoa) inner join coliseuestoque.produto p on(pf.idproduto = p.idproduto) inner join coliseuestoque.item i on(p.idproduto= p.idproduto) where i.iditem = 1

cara,

segue uma ai que eu fiz, ve se funciona

select f
from Fornecedor f
inner join fetch f.pessoa // vc nao colocou a referencia para essa entidade
inner join f.produtoFornecedores pf
inner join pf.produto p
inner join p.itens i // vc deve ter uma referencia de itens em produto
where i.idItem = 1

Exatamente cara, deu certo aqui.

faltava mesmo a referencia de item em produto

Muito obrigado!

valeu

boaaa

marque o titulo como resolvido.
t+