Ajuda no Hibernate (select)

9 respostas
L

Olá, tenho o seguinte select:

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…

Valeu!

9 Respostas

M

Vc tentou usar query nativa ??

http://www.guj.com.br/posts/list/62950.java#331236

_fs
select n.numero, n.data, n.vendedor, i.produto_id, i.quantidade 
from notas n 
join notas.itens i
where n.data < :data 
    and i.quantidade > :quantidade

?

L

Não estou certo de que isto irá me retornar uma estrutura que use as classe Notas e a classe Itens…

L

Usando Hibernate voce tentou fazer assim:

SELECT n, i
FROM notas n JOIN itens i on n.id = i.nota_id
WHERE n.data < :data
AND i.quantidade > :quantidade

Daí o resultado que voltará será uma lista de Object[] e depois voce faz um for pra colocar o itens dentro da nota, mais ou menos assim:

List<Object[]> list = (aqui voce roda a query);

for(Object[] objs : list)

{

Notas n = objs[0];

n.setItens = objs[1];

}
L

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?

acdesouza
1. Crie um construtor para a classe Notas com os campos que você quer preenchido. Mais ou menos assim:
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.
}
2. 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

3. Seja feliz e divulgue as vantagens do uso do Hibernate entre seus colegas :lol:

L

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();
ox1
acdesouza:
1. Crie um construtor para a classe Notas com os campos que você quer preenchido. Mais ou menos assim:
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.
}
2. 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

3. Seja feliz e divulgue as vantagens do uso do Hibernate entre seus colegas :lol:


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...

ox1

Ninguém… ?

Criado 10 de setembro de 2007
Ultima resposta 20 de jan. de 2009
Respostas 9
Participantes 6