Ajuda com NamedQuery

2 respostas
jpqljavahibernate
rafael_moreira1

Eu tentei fazer a query usando expression constructors e jpql, mas o jpql não eceita subqueryes e estou, então, tentando fazer com nativeQuery. Estou recebendo mensagem de erro. Alguém saberia porquê?

A query é a seguinte :

StringBuilder jpql = new StringBuilder();
jpql.append("select a2.codigoProduto , a2.descricao, a2.quantidade_recente, Soma ,a2.valor, a2.valor * Soma from")
	.append("(select p.codigoProduto,  sum(p.quantidade_recente) Soma   from Produto p ,Usuario u ")
	.append("where u.codigo = p.codigo_filial and u.codigo_chefe = 3  ) as a1,")
	.append(" (SELECT p1.codigoProduto, p1.descricao, p1.quantidade_recente , p1.valor from Produto aS p1,  Usuario u ")
	.append("where u.codigo = p1.codigo_filial and u.codigo_chefe = 3 ) as a2 ")
	.append("where a2.codigoProduto = a1.codigoProduto");

// metodo buscarPorPaginacao
Query query = manager.createNativeQuery(jpql.toString(), Filtro.class);
// query.setParameter("codigo", 3L);

@SuppressWarnings("unchecked")
List<Filtro> resultado = query.getResultList();

for (Filtro prod : resultado) {
	System.out.println(" Impressão Filtro da Empresa: ");
	System.out.println(" CodigoProduto : " + prod.getCodigoProduto() + " Produto " + prod.getDescricao() + " Quantidade " + prod.getQuantidade() + " Total " + prod.getSoma() + " Receita " + prod.getReceita());
}

A query que sai no console é a seguinte :

select
	a2.codigoProduto,
	a2.descricao,
	a2.quantidade_recente,
	Soma,
	a2.valor,
	a2.valor * Soma
from
	(
		select
			p.codigoProduto,
			sum(p.quantidade_recente) Soma
		from
			Produto p,
			Usuario u 
		where
			u.codigo = p.codigo_filial
			and u.codigo_chefe = 3
	) as a1,
	(
		SELECT
			p1.codigoProduto,
			p1.descricao,
			p1.quantidade_recente,
			p1.valor 
		from
			Produto aS p1,
			Usuario u 
		where
			u.codigo = p1.codigo_filial 
			and u.codigo_chefe = 3
	) as a2 
where
	a2.codigoProduto = a1.codigoProduto

Ela é executada no mysql e retorna resultados corretamente, mas na classe que estou testando ocorre o seguinte erro:

Caused by: java.sql.SQLException: Column 'codigo' not found.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:996)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:924)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:870)
at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1064)
at com.mysql.jdbc.ResultSetImpl.getLong(ResultSetImpl.java:2743)
at com.mchange.v2.c3p0.impl.NewProxyResultSet.getLong(NewProxyResultSet.java:2478)
at org.hibernate.type.descriptor.sql.BigIntTypeDescriptor$2.doExtract(BigIntTypeDescriptor.java:74)
at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:64)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:267)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:263)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253)
at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:338)
at org.hibernate.loader.Loader.extractKeysFromResultSet(Loader.java:785)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:721)
at org.hibernate.loader.Loader.processResultSet(Loader.java:953)
at org.hibernate.loader.Loader.doQuery(Loader.java:921)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355)
at org.hibernate.loader.Loader.doList(Loader.java:2554)
... 10 more

2 Respostas

Lucas_Camara

Acredito que seja por que você está informando o tipo do objeto que será retornado: manager.createNativeQuery(jpql.toString(), Filtro.class);. Ao retornar o resultSet, dá erro.

Por questão de teste, remova o parâmetro Filtro.class do método createNativeQuery e, em vez de obter um List<Filtro> do método query.getResultList(), faça assim: List<Object[]> resultado = query.getResultList();, e veja se funciona ou se pelo menos o erro muda.

rafael_moreira1

Consegui fazendo DTO com hibernate hql

public List<Filtro> listarProdutosDoGerenteRegional(Long codigo) {
	String hql = "select p1.codigoProduto as codigoProduto, p1.descricao as descricao,p1.codigoFilial as filial, p1.quantidadeRecente as quantidade,"
			+ " (select sum(p.quantidadeRecente) from Produto p where  p.gerenteFilial.chefe.codigo =:codigo and trim(p.codigoProduto) = trim(p1.codigoProduto)) as soma, "
			+ " p1.valor as valor,"
			+ " (select sum(p.quantidadeRecente) * p.valor from Produto p where p.gerenteFilial.chefe.codigo =:codigo  and trim(p.codigoProduto) = trim(p1.codigoProduto)) as receita"
			+ " from Produto p1  where p1.gerenteFilial.chefe.codigo =:codigo order by trim(p1.codigoProduto)";

	Session session = manager.unwrap(Session.class);
	Query query = session.createQuery(hql).setResultTransformer(Transformers.aliasToBean(Filtro.class));

	query.setParameter("codigo", codigo);

	return query.list();
}
Criado 7 de julho de 2017
Ultima resposta 24 de jul. de 2017
Respostas 2
Participantes 2