select n.numero, n.data, n.vendedor, i.produto_id, i.quantidade
from notas n
join itens i on (n.id = itens.nota_id)
where n.data<:data
and i.quantidade > :quantidade
Preciso disto escrito no HQL ou Criteria e que as notas venha com os itens já carregados tudo na memória.
Não estou conseguindo trazer apenas alguns campos das tabelas…
Ei pessoal, essas soluções não estão legais…
Essas minhas tabelas possuem muitos campos e neste processo preciso apenas de alguns.
Não tem uma forma de se obter os objetos via criteria já montados?
Crie um construtor para a classe Notas com os campos que você quer preenchido. Mais ou menos assim:
[code]public class Notas{
public Notas(Long numero, Date data, Vendedor vendedor, Long produtoId, Long produtoQtd){
this.numero = numero;
this.data = data;
this.vendedor = vendedor;
//Preencher o produto
Produto produto = new Produto();
produto.setId(produtoId);
produto.setQuantidade(produtoQuantidade);
this.produto = produto;
}
//Não esqueça do construtor sem parâmetros, quase todos os frameworks o usam.
public Notas(){
}
//O resto da sua classe.
}[/code]
Altere a consulta para usar seu construtor:
select new notas(n.numero, n.data, n.vendedor, i.produto_id, i.quantidade)
from notas n
join itens i on (n.id = itens.nota_id)
where n.data<:data
and i.quantidade > :quantidade
Seja feliz e divulgue as vantagens do uso do Hibernate entre seus colegas :lol:
Eu estava querendo evitar a criação de construtores, pois podem haver muitas variações.
Eu consegui trazer os dados todos para a memória, usando uma propriedade fetch=“subselect” dentro do hbm da nota. Ele traz todos os itens de todas as notas que estou trabalhando.
Não obstante fiquei feliz com o resultado, mas agora tenho mais uma dúvida: só quero os itens com a quantidade maior que X…, Mas mesmo que uma nota não tenha nenhum item maior que X, deve trazê-la. (left join)
O Criteria ficou assim:
List list = Sistema.getSession()
.createCriteria(Nota.class)
.add(Restrictions.eq("data", dataHoje))
.setFetchMode("itens", FetchMode.JOIN)
.list();
[quote=acdesouza]1. Crie um construtor para a classe Notas com os campos que você quer preenchido. Mais ou menos assim:
[code]public class Notas{
public Notas(Long numero, Date data, Vendedor vendedor, Long produtoId, Long produtoQtd){
this.numero = numero;
this.data = data;
this.vendedor = vendedor;
//Preencher o produto
Produto produto = new Produto();
produto.setId(produtoId);
produto.setQuantidade(produtoQuantidade);
this.produto = produto;
}
//Não esqueça do construtor sem parâmetros, quase todos os frameworks o usam.
public Notas(){
}
//O resto da sua classe.
}[/code]
Altere a consulta para usar seu construtor:
select new notas(n.numero, n.data, n.vendedor, i.produto_id, i.quantidade)
from notas n
join itens i on (n.id = itens.nota_id)
where n.data<:data
and i.quantidade > :quantidade
Seja feliz e divulgue as vantagens do uso do Hibernate entre seus colegas :lol: [/quote]
Eu sei que o tópico é antigo mas estou com essa mesma dúvida, com uma diferença: Não consigo usar um construtor dentro de outro em vez de usar o objeto todo como parametro.
Mais ou menos assim:
No exemplo que o acdesouza deu, aparentemente um construtor poderia ser usado no lugar de “n.vendedor”, supondo que eu criei um construtor para Vendedor passando o id e o nome:
select new notas(n.numero, n.data, new Vendedor(v.id, v.nome), i.produto_id, i.quantidade)
from notas n
join n.itens i on
join n.vendedor v
where n.data<:data
and i.quantidade > :quantidade
Erro:
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: new near line 1, column 45
eu estou precisando escolher apenas alguns campos de uma entidade dentro de outra…