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

4 respostas
L

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

4 Respostas

L

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?

J

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.

L

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

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());
			}
		}
	}
Criado 5 de março de 2012
Ultima resposta 5 de mar. de 2012
Respostas 4
Participantes 2