Join em HQL em classe com compositeId

5 respostas
A

Olá Galera, sou iniciante em Hibernate estou tendo dificuldade para trascrever uma consulta SQL para o HQL.
Pois estou utilizando o ireport para criar relatorios. a duvida é como ficaria o hql equivalente ao sql a baixo.

realtando que a Classe ItensNf possui Id Composto por outra classe ItensNfPk no caso.

SELECT
fornecedor.“id_forn” AS fornecedor_id_forn,
fornecedor.“nome_fantasia” AS fornecedor_nome_fantasia,
fornecedor.“cnpj_cpf_forn” AS fornecedor_cnpj_cpf_forn,
itens_nf.“id_nf” AS itens_nf_id_nf,
itens_nf.“id_insu” AS itens_nf_id_insu,
itens_nf.“quantidade_itens” AS itens_nf_quantidade_itens,
itens_nf.“valor_unitario” AS itens_nf_valor_unitario,
itens_nf.“valor_total” AS itens_nf_valor_total,
insumos.“id_insu” AS insumos_id_insu,
insumos.“descricao_insumo” AS insumos_descricao_insumo,
notas_fiscais.“id_nf” AS notas_fiscais_id_nf,
notas_fiscais.“id_forn” AS notas_fiscais_id_forn,
notas_fiscais.“numero_nota” AS notas_fiscais_numero_nota,
notas_fiscais.“valor_nota” AS notas_fiscais_valor_nota,
notas_fiscais.“data_emissao” AS notas_fiscais_data_emissao,
notas_fiscais.“data_compra” AS notas_fiscais_data_compra,
notas_fiscais.“valor_frete” AS notas_fiscais_valor_frete,
notas_fiscais.“valor_prdutos” AS notas_fiscais_valor_prdutos,
notas_fiscais.“icms_produtos” AS notas_fiscais_icms_produtos
FROM
"public".“insumos” insumos INNER JOIN “public”.“itens_nf” itens_nf ON insumos.“id_insu” = itens_nf."id_insu"
INNER JOIN “public”.“notas_fiscais” notas_fiscais ON itens_nf.“id_nf” = notas_fiscais."id_nf"
INNER JOIN “public”.“fornecedor” fornecedor ON notas_fiscais.“id_forn” = fornecedor.“id_forn”

Se Alguém puder min ajudar agradeço.

5 Respostas

otaviojava

Caro colega.
Isso depende muito de como está desenhando suas classes.
O hibernte de uma maneira básica pega seu banco relacional e mapeia um objeto.
Então você tem que primeiro saber como seu objeto está mapeado.

A

Caro Otavio obrigado pela atenção.

Estou postanto os codigos das Classe ver se consegue mim dar clariada.

A classe NotaFiscal

public class NotaFiscal implements Serializable{

@Id

@SequenceGenerator(name=notas_fiscais_id_nf_seq, sequenceName=notas_fiscais_id_nf_seq)

@GeneratedValue(generator=notas_fiscais_id_nf_seq)

private long id_nf;

@Column

private String numero_nota;

@Temporal(TemporalType.DATE)

private Date data_emissao;

@Temporal(TemporalType.DATE)

private Date data_compra;

@Column

private BigDecimal valor_nota = new BigDecimal(0.00);
@Column
private BigDecimal valor_frete = new BigDecimal("0.00");
@Column
private BigDecimal valor_prdutos = new BigDecimal("0.00");
@Column
private BigDecimal icms_produtos = new BigDecimal("0.00");

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="id_forn")
private Fornecedor fornecedor;
//relaciona com insumo

@OneToMany(fetch = FetchType.LAZY,  mappedBy = pk.notasFiscais,cascade={CascadeType.ALL})

private List ItensNf = new LinkedList();

A classe ItensNf que possui uma chave composta pelo ID da nota Fisca e do Produto lançado na nota.

public class ItensNf{

private ItensNfPK pk = new ItensNfPK();
 private BigDecimal quantidade_itens = new BigDecimal("0.00");
 private BigDecimal valor_unitario = new BigDecimal("0.00");
 private BigDecimal valor_total = new BigDecimal("0.00");

@EmbeddedId
private ItensNfPK getPk() {
    return pk;
}

private void setPk(ItensNfPK pk) {
    this.pk = pk;
}

@Transient
public Insumo getInsumo(){
    return getPk().getInsumo();
}
public void setInsumo(Insumo insumo){
    getPk().setInsumo(insumo);
}

@Transient
public NotaFiscal getNotasFiscais(){
    return getPk().getNotasFiscais();
}

A Classe Insumo

public class Insumo implements Serializable {

@Id
@SequenceGenerator(name="insumos_id_insu_seq", sequenceName="insumos_id_insu_seq")
@GeneratedValue(generator="insumos_id_insu_seq")
@Column( nullable = false)
private long id_insu;

@Column(name = "descricao_insumo")
private String descricaoInsumo;
@Column(name = "unidade")
private String unidade;
@Column(name = "preco_insumo")
private BigDecimal precoinsumo;

@OneToMany(fetch = FetchType.LAZY,  mappedBy = "pk.insumo",cascade={CascadeType.ALL})
private List<ItensNf> ItensNf = new LinkedList<ItensNf>();

E a Classe Fornecedor que está relacionada com a Classe NotaFiscal

public class Fornecedor{

@Id

@SequenceGenerator(name=fornecedor_id_forn_seq, sequenceName=fornecedor_id_forn_seq)

@GeneratedValue(generator=fornecedor_id_forn_seq)

@Column( nullable = false)

private long id_forn;

@Column(length=100)

private String nome_fantasia;

@Column(length=100)

private String razao_social;

@Column(length=20)

private String tipo_fornecedor;

@Column (name=cnpj_cpf_forn,length=16)

private String cpj_cnp_forn;
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="fornecedor")
private Set<Fornecedor> fornecedor = new HashSet<Fornecedor>(0);

Com isso vc Cosegue ter uma idéia do que é Preciso fazer em HQL, que mim retorne uma nota fiscal com nome do seu fornecedor e os produtos que foram vinculados a mesma?

otaviojava

Entendo:

Você pode fazer uma consulta usando o Criteria:
Aparente você não está fazendo nenhum critério.

Criteria criteria = session.createCriteria(Fornecedor.class);
//se tiver alguma condição você pode colocar aqui, mas não vi nenhuma
  criteria.add(Restrictions.eq("nome_fantasia", "java"));
//repare qeu nesse caso estou usando a condição do nome fantasia ser igual a java
//se vc comentar a linha ele trará todas as condições
  List<Fornecedor> fornecedores= new ArrayList<Fornecedor>();
  fornecedores = criteria.list();
otaviojava

Agora usando o Hql
Será um pouco semelhante ao de cima com a condição do nome

String sql = "from Fornecedor where  nome_fantasia=:nome_fansatia";
     List<Fornecedor> fornecedores = session.createQuery(sql).setString("nome_fantasia", "java").list();
A

Olá Otavio obrigado pelo interesse e ajudar.

O seguinte as soluções propostas por vc não resolveu pois precisa ser em hql pois é para criação de um relatório no ireport e não aceita criteria, pelo menos não encotrei essa opção.
além disso acho que não expressei corretamente minha necessidade.

veja então o que preciso.

Preciso saber como escrevo um hql que min retorne:

1-> Os itens da classe ItensNf, juntamente com

2-> A descrição dos intens, o atributo com a descrição do item fica na classe Insumo, ainda;

3->Trazer o numero da nota e data que fica na classe NotaFiscal. juntamente com;

4-> O nome do fornecedor que corresponde ao atributo nome_fantasia da classe fornecedor.

O Sql do inicio do tópico mim retorna exatamente isso.

Lembrando que há um relacionamento ManyToMany entre as Classes NotaFiscal e Insumo, através da Classe ItensNf, sendo que a mesma possui outros atributos além dos Id das duas classes envolvidas.
E há um relacionamento de OneToMany da classe NotaFiscal para a classe Fornecedor.

Criado 2 de janeiro de 2011
Ultima resposta 9 de jan. de 2011
Respostas 5
Participantes 2