Ajuda no Hibernate (select)

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!

Vc tentou usar query nativa ??

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

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 

?

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

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];
}

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?

  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]

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

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

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

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

Ninguém… ?