Erro ao executar Query, por favor ajudem

4 respostas
M

Pessoal, estou com um problema ao executar um query.
Não estou entendo o pq desse erro.

Meu DAO:

public class IGDao {

	public static List<Item> ListaInfo() {

		System.out.println("Abrindo sessao para INFORMAÇÔES GERENCIAIS");
		Session s = HibernateUtil.getSession();
		System.out.println("Sessão IG iniciada com sucesso!!!");

		System.out.println("Executando query...");
		String sql = "SELECT "
				+ "             CM_POLO.DS_POLO, "
				+ "             SUM( DECODE( ES_PRODUTO_FARMACEUTICO.DM_CLASSIFICACAO, '3', CM_ITEM.QTDE, 0 ) ) UNIDADE_PERF, "
				+ "             SUM( DECODE( ES_PRODUTO_FARMACEUTICO.DM_CLASSIFICACAO, '3', 0, CM_ITEM.QTDE ) ) UNIDADE_MED, "
				+ "             SUM( DECODE( ES_PRODUTO_FARMACEUTICO.DM_CLASSIFICACAO, '3', CM_ITEM.VL_LIQUIDO_TOTAL, 0 ) ) VALOR_PERF, "
				+ "             SUM( DECODE( ES_PRODUTO_FARMACEUTICO.DM_CLASSIFICACAO, '3', 0, CM_ITEM.VL_LIQUIDO_TOTAL ) ) VALOR_MED "
				+ "   FROM      CM_POLO, "
				+ "             ES_PRODUTO_FARMACEUTICO, "
				+ "             CM_VENDEDOR, "
				+ "             CM_ITEM, "
				+ "             CM_MOVIMENTO "
				+ "   WHERE     ES_PRODUTO_FARMACEUTICO.ID_PRODUTO  = CM_ITEM.ID_PRODUTO "
				+ "   AND       CM_POLO.ID_POLO                     = CM_VENDEDOR.ID_POLO "
				+ "   AND       CM_VENDEDOR.ID_VENDEDOR             = CM_MOVIMENTO.ID_VENDEDOR "
				+ "   AND       CM_ITEM.ID_MOVIMENTO                = CM_MOVIMENTO.ID_MOVIMENTO "
				+ "   AND       CM_MOVIMENTO.DM_CANCELAMENTO       <> 'S' "
				+ "   AND       CM_MOVIMENTO.ID_TIPO_NOTA           IN ( 1, 10, 11 ) "
				+ "   AND       CM_MOVIMENTO.DT_MOVIMENTO           BETWEEN   TO_DATE('10/02/2008', 'dd/mm/yyyy') "
				+ "                                                 AND       TO_DATE('12/03/2008', 'dd/mm/yyyy') "
				+ "   GROUP BY  CM_POLO.DS_POLO";

		SQLQuery qryIG = s.createSQLQuery(sql).addEntity(Item.class).addEntity(
				Movimento.class).addEntity(Vendedor.class)
				.addEntity(Polo.class).addEntity(ProdutoFarmaceutico.class);
		// qryIG.setParameter("dtInicial", string);
		// qryIG.setParameter("dtFinal", string);

		// qryIG.setResultTransformer(Transformers.aliasToBean(Item.class));

		return qryIG.list();
	}
}

Erro Gerado:

16:09:34,384 INFO LongType:182 - could not read column value from result set: ID_MOVIMENTO; Nome de coluna inválido 16:09:34,389 WARN JDBCExceptionReporter:77 - SQL Error: 17006, SQLState: 99999 16:09:34,389 ERROR JDBCExceptionReporter:78 - Nome de coluna inválido Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not execute query at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103) at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.loader.Loader.doList(Loader.java:2223) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) at org.hibernate.loader.Loader.list(Loader.java:2099) at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289) at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695) at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142) at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152) at br.com.fitsistemas.dao.IGDao.ListaInfo(IGDao.java:53) at br.com.fitsistemas.manager.ItemManager.main(ItemManager.java:15) Caused by: java.sql.SQLException: Nome de coluna inválido at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70) at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:229) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:403) at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:3366) at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:2009) at oracle.jdbc.driver.OracleResultSet.getLong(OracleResultSet.java:440) at com.mchange.v2.c3p0.impl.NewProxyResultSet.getLong(NewProxyResultSet.java:2625) at org.hibernate.type.LongType.get(LongType.java:28) at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163) at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:154) at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1097) at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:565) at org.hibernate.loader.Loader.doQuery(Loader.java:701) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) at org.hibernate.loader.Loader.doList(Loader.java:2220) ... 8 more

4 Respostas

P

Você já checou nas suas tabelas se o campo ID_MOVIMENTO está grafado corretamente?

S

Opaa,

Ou no seu select vc fez a projeção de uma coluna que não existe, ou na hora de vc dar o resultSet.get ta fazendo o get em uma coluna que não existe.

Acho que deve ser isto.

abraço

M

Pessoal ja resolvi o problema.
Quando aprendemos Hibernate estamos acostumados com TABELAS TABELAS TABELAS, e esquecemos que estamos lidando com classes de OR.

O que eu fiz foi criar uma classe com os campos que uso na query.

import java.math.BigDecimal;
import java.util.Date;

public class VendasPorPolo {

	private String DS_POLO;
	private String DM_CLASSIFICACAO;
	private Long QTDE;
	private BigDecimal UNIDADE_PERF;
	private BigDecimal UNIDADE_MED;
	private BigDecimal VALOR_PERF;
	private BigDecimal VALOR_MED;
	private Long VL_LIQUIDO_TOTAL;
	private Long ID_PRODUTO;
	private Long ID_POLO;
	private Long ID_VENDEDOR;
	private Long ID_MOVIMENTO;
	private String DM_CANCELAMENTO;
	private Long ID_TIPO_NOTA;
	private Date DT_MOVIMENTO;

	public String getDS_POLO() {
		return DS_POLO;
	}

	public void setDS_POLO(String ds_polo) {
		DS_POLO = ds_polo;
	}

	public String getDM_CLASSIFICACAO() {
		return DM_CLASSIFICACAO;
	}

	public void setDM_CLASSIFICACAO(String dm_classificacao) {
		DM_CLASSIFICACAO = dm_classificacao;
	}

	public Long getQTDE() {
		return QTDE;
	}

	public void setQTDE(Long qtde) {
		QTDE = qtde;
	}

	public BigDecimal getUNIDADE_PERF() {
		return UNIDADE_PERF;
	}

	public void setUNIDADE_PERF(BigDecimal unidade_perf) {
		UNIDADE_PERF = unidade_perf;
	}

	public BigDecimal getUNIDADE_MED() {
		return UNIDADE_MED;
	}

	public void setUNIDADE_MED(BigDecimal unidade_med) {
		UNIDADE_MED = unidade_med;
	}

	public BigDecimal getVALOR_PERF() {
		return VALOR_PERF;
	}

	public void setVALOR_PERF(BigDecimal valor_perf) {
		VALOR_PERF = valor_perf;
	}

	public BigDecimal getVALOR_MED() {
		return VALOR_MED;
	}

	public void setVALOR_MED(BigDecimal valor_med) {
		VALOR_MED = valor_med;
	}

	public Long getVL_LIQUIDO_TOTAL() {
		return VL_LIQUIDO_TOTAL;
	}

	public void setVL_LIQUIDO_TOTAL(Long vl_liquido_total) {
		VL_LIQUIDO_TOTAL = vl_liquido_total;
	}

	public Long getID_PRODUTO() {
		return ID_PRODUTO;
	}

	public void setID_PRODUTO(Long id_produto) {
		ID_PRODUTO = id_produto;
	}

	public Long getID_POLO() {
		return ID_POLO;
	}

	public void setID_POLO(Long id_polo) {
		ID_POLO = id_polo;
	}

	public Long getID_VENDEDOR() {
		return ID_VENDEDOR;
	}

	public void setID_VENDEDOR(Long id_vendedor) {
		ID_VENDEDOR = id_vendedor;
	}

	public Long getID_MOVIMENTO() {
		return ID_MOVIMENTO;
	}

	public void setID_MOVIMENTO(Long id_movimento) {
		ID_MOVIMENTO = id_movimento;
	}

	public String getDM_CANCELAMENTO() {
		return DM_CANCELAMENTO;
	}

	public void setDM_CANCELAMENTO(String dm_cancelamento) {
		DM_CANCELAMENTO = dm_cancelamento;
	}

	public Long getID_TIPO_NOTA() {
		return ID_TIPO_NOTA;
	}

	public void setID_TIPO_NOTA(Long id_tipo_nota) {
		ID_TIPO_NOTA = id_tipo_nota;
	}

	public Date getDT_MOVIMENTO() {
		return DT_MOVIMENTO;
	}

	public void setDT_MOVIMENTO(Date dt_movimento) {
		DT_MOVIMENTO = dt_movimento;
	}

}

Assim consegui resolver o problema.

public class TestaVendasPorPolo {

	public static void main(String[] args) {

		List<VendasPorPolo> vendasPolo = IGDao.ListaVendasPorPolo();
		System.out.println("Rodando o FOR...");
		for (VendasPorPolo resultado : vendasPolo) {

			System.out.println("DS_POLO -> " + resultado.getDS_POLO());

		}
		System.out.println("");
		System.out.println("Destruindo session...");
		System.out.println("");
		Session s = HibernateUtil.getDestroy();
		System.out.println("Session destruida!");
         }
}

Mas mesmo assim valeu pessoal!!

C

Deixa ver se eu entendi, pq acho que estou com um problema igual.

Você tem várias tabelas/objetos em seu select e quer pegar a resposta sem ser num vetor de Objects ae vc criou um objeto exatamente com os campos de resposta do select!

O que eu fiz, mas não ficou elegante é adicionar vários, addScalar, mesmo eu estando no SQL pedindo todos os campos item.*, quando uso o addScalar, ele só me traz os campos definidos :

Take a look:

session = (Session) emanager.getDelegate();
            StringBuffer sb = new StringBuffer();
            sb.append("select item.*, folder.NAME from ALB_ITEM item, ");
            sb.append("ALB_FOLDER folder, ALB_USER user ");
            sb.append("WHERE item.FK_FOLDER_ID = folder.ID ");
            sb.append("and folder.FK_USER_ID = user.ID ");
            sb.append("and user.MSISDN =");
            sb.append("'").append(user.getMsisdn()).append("'");

            items = session.createSQLQuery(sb.toString())
                .addScalar("FILE_NAME", Hibernate.STRING)
                .addScalar("CAPTION", Hibernate.STRING)
                .addScalar("DESCRIPTION", Hibernate.STRING)
                .addScalar("MMR_ID", Hibernate.STRING)
                .addScalar("URL", Hibernate.STRING)
                .addScalar("NAME", Hibernate.STRING)//folderName
                .addScalar("UPLOAD_DATE", Hibernate.DATE)
                .addScalar("TAKEN_ON", Hibernate.DATE)
                .addScalar("ARTIST", Hibernate.STRING)
                .addScalar("TITLE", Hibernate.STRING)
                .list();
            return items;

Aproveitando o post, meu grande problema que só consigo fazer essa query usando SQL puro, pq via Objetos Relacionais, eu não tenho acesso a essas FK’s. Queria muito fazer isso em HQL.

Outra pergunta: ao invez de fazer esses alias na consulta por exemplo:

ALB_FOLDER folder

Eu poderia usar

.addEntity("folder",Folder.class)

Valeu galera!

Abraços

Criado 17 de março de 2008
Ultima resposta 14 de mai. de 2008
Respostas 4
Participantes 4