HQL + Apenas Alguns Campos em um Novo Objeto [RESOLVIDO]

Pessoal boa tarde, estou fazendo uns testes aqui e estou com o seguinte problema:

Tenho um modelo de ItenDaVenda:

@Entity
@Table(name = "itens_da_venda")
public class ItenDaVenda {

	@Id
	@GeneratedValue
	@Column(name = "id_iten", nullable = false, unique = true)
	private Long id;

	@ManyToOne
	@JoinColumn(name = "id_venda", nullable = false)
	private Venda venda;

	@ManyToOne
	@JoinColumn(name = "id_produto", nullable = false)
	private Produto produto;

	@Column(name = "quantidade", nullable = false)
	private Integer quantidade;

	@Column(name = "vl_unit", nullable = false)
	private Double valorUnitario;
......
}

To precisando saber a porcentagens de produtos vendidos, ai tenho está sql:

SELECT ((SUM(i.quantidade)/(SELECT SUM(i.quantidade) FROM itens_da_venda i ))*100) AS porcentagem, 
         i.id_produto,
			SUM(i.quantidade) AS quantidade_vendida
FROM itens_da_venda i, vendas v 
WHERE    (i.id_venda     =     v.id_venda 
    AND   v.dt_venda    >=    '2012-01-01 00:00:00' 
	 AND   v.dt_venda    <=    '2012-12-31 23:59:59')
GROUP BY i.id_produto 
ORDER BY porcentagem

Então o que ocorre tenho dois campos a mais do que o objeto original, porcentagem e quantidade_vendida.

Minha duvida é a seguinte, preciso saber como pegar por HQL só alguns campos de um modelo que ainda não existe!?

Quem puder me ajudar!! Desde já Agradeço!!

Achei um exemplo antigo aqui, que para mim resolveria:

	public List<Aluno> listar() throws Exception {
		Connection pegaConexao = null;
		List<Aluno> lista = new ArrayList<Aluno>();

		try {

			pegaConexao = ConectDataBase.getConnection();
			String sql = "SELECT * FROM alunos ORDER BY codigo";
			PreparedStatement preparo = pegaConexao.prepareStatement(sql);
			ResultSet registroDoBanco = preparo.executeQuery();

			while (registroDoBanco.next()) {

				Aluno aluno = new Aluno();

				aluno.setCodigo(registroDoBanco.getLong("codigo"));
				aluno.setNome(registroDoBanco.getString("nome"));
				aluno.setCpf(registroDoBanco.getString("cpf"));
				aluno.setTelefone(registroDoBanco.getString("telefone"));
				aluno.setSituacao(registroDoBanco.getString("situacao"));
				aluno.setBairro(registroDoBanco.getString("bairro"));
				aluno.setCep(registroDoBanco.getString("cep"));
				aluno.setCidade(registroDoBanco.getString("cidade"));
				aluno.setRua(registroDoBanco.getString("rua"));

				lista.add(aluno);
			}
		} catch (SQLException e) {
			System.out.println("Erro na SQL");
		} finally {
			try {
				pegaConexao.close();
			} catch (Exception e) {
				System.out.println("Erro ao conectar o banco");
			}
		}

		return lista;
	}

eu consigo fazer isso com a sessão do hibernate mesmo?

Uma opção é você adicionar essas duas colunas na sua entidade, mas com a annotation @Transient , assim não serão persistidas …
A sua HQL ficaria algo assim

SELECT New ItenDaVenda( ((SUM(i.quantidade)/(SELECT SUM(i.quantidade) FROM itens_da_venda i ))*100),  i.id_produto, SUM(i.quantidade))

Lembre-se de criar um construtor na sua entidade que receba esses parâmetros, além do construtor default.

Então acho que ia ficar meio inviável então se não achar outro jeito vou fazer na mão mesmo com o bom e velho JDBC… hehhe

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public final class JDBCUtil {

	public static Connection getConnection() {

		final String driver = "com.mysql.jdbc.Driver";
		final String local = "jdbc:mysql://localhost:3306/projeto4";
		final String login = "java";
		final String senha = "java";

		Connection conexao = null;

		try {
			Class.forName(driver);
			conexao = DriverManager.getConnection(local, login, senha);
		} catch (ClassNotFoundException e) {
			System.out.println("DRIVER NAO ENCONTRADO");
		} catch (SQLException e) {
			System.out.println("ERRO DE BANCO DE DADOS");
		}

		return conexao;
	}
}

Pessoal não consegui com HQL, mas para quem tiver o mesmo problema segue o código que usei e funcionou.

Conexão JDBC simples.

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public final class JDBCUtil {

	public static Connection getConnection() {

		final String driver = "com.mysql.jdbc.Driver";
		final String local = "jdbc:mysql://localhost:3306/projeto4";
		final String login = "java";
		final String senha = "java";

		Connection conexao = null;

		try {
			Class.forName(driver);
			conexao = DriverManager.getConnection(local, login, senha);
		} catch (ClassNotFoundException e) {
			System.out.println("DRIVER NAO ENCONTRADO");
		} catch (SQLException e) {
			System.out.println("ERRO DE BANCO DE DADOS");
		}

		return conexao;
	}
}

Sql:

public void buscaRelacaoDeProdutosVendidos(String periodoDe, String periodoAte) throws Exception {


		
		Connection pegaConexao = null;

		try {

			pegaConexao = JDBCUtil.getConnection();
			StringBuffer sql = new StringBuffer();

			sql.append(" SELECT ");
			sql.append("     i.id_produto");
			sql
					.append("     ,((SUM(i.quantidade)/(SELECT SUM(i.quantidade) FROM itens_da_venda i ))*100) AS porcentagem ");
			sql.append("     ,SUM(i.quantidade) AS quantidade_vendida ");
			sql.append("     ,(SELECT SUM(i.quantidade) FROM itens_da_venda i ) AS vendas_totais ");
			sql.append(" FROM itens_da_venda i, vendas v ");
			sql.append(" WHERE ");
			sql.append("         (i.id_venda     =    v.id_venda ");
			sql.append("   AND    v.dt_venda    >=    ? ");
			sql.append("   AND    v.dt_venda    <=    ?) ");
			sql.append(" GROUP BY ");
			sql.append("     i.id_produto ");
			sql.append(" ORDER BY ");
			sql.append("     porcentagem ");

			PreparedStatement preparo = pegaConexao.prepareStatement(sql.toString());
			preparo.setString(1, periodoDe);
			preparo.setString(2, periodoAte);
			ResultSet registroDoBanco = preparo.executeQuery();

			while (registroDoBanco.next()) {
				System.out.println(registroDoBanco.getLong("id_produto"));
				System.out.println(registroDoBanco.getDouble("porcentagem"));
				System.out.println(registroDoBanco.getInt("quantidade_vendida"));
				System.out.println(registroDoBanco.getLong("vendas_totais"));
			}

		} catch (SQLException e) {
			throw e;
		} finally {
			try {
				pegaConexao.close();
			} catch (Exception e) {
				throw new Exception("erro ao conectar o banco".toUpperCase());
			}
		}
	}