Problema com @SqlResultSetMapping

1 resposta
J

Olá Pessoal,

Em um sistema eu preciso realizar um Count em uma consulta SQL. Estou usando o @SqlResultSetMapping para construir uma consulta nativa que me retorne o que desejo. No meu bean em declaro:

@Entity
...
@SqlResultSetMapping(
    name="FalhasCircuitos",
    entities=@EntityResult(
         entityClass=IGF.class, 
         fields=@FieldResult(name="circuito", column="circuito")),
   columns=@ColumnResult(name="resCount")
)
public class IGF implements Serializable {
....

Em um DAO eu declaro:

public List FalhasCircuitosCMD(CMD cmd) {
      // Abre a conexão ao BD
      EntityManagerFactory emf = Persistence.createEntityManagerFactory("ImportarCROPU");
      EntityManager em = emf.createEntityManager();

      // Cria a consulta
      String consultaS = "select i.circuito, count(i.idigf) as resCount " +
         "from igf i left join Cidade on i.idcidade = cidade.idcidade " +
         "where cidade.idcmd = " + cmd.getIdcmd() + 
         " group by i.circuito order by resCount desc";
      log.info(consultaS);
      Query consulta = em.createNativeQuery(consultaS, "FalhasCircuitos");

      // Define os parâmetros da consulta
      consulta.setParameter("cmd", cmd);
      consulta.setMaxResults(10);

      // Executa a consulta e recupera a lista
      List falhas = consulta.getResultList();

      // Retorna a lista
      return falhas;
   }

O problema é que como a consulta não inclui a chave primária da tabela IGF (não dá pra usar pois a PK é uma surrogate key e se eu usar meu count não funciona…) quando vou recuperar a lista tenho o erro:

01/03/2008 11:15:17 br.com.bandeirante.dao.IGFDAO FalhasCircuitosCMD
INFO: select i.circuito, count(i.idigf) as resCount from igf i left join Cidade on i.idcidade = cidade.idcidade where cidade.idcmd = 7 group by i.circuito order by resCount desc
[TopLink Warning]: 2008.03.01 11:15:17.265--UnitOfWork(22406059)--Exception [TOPLINK-6044] (Oracle TopLink Essentials - 2.0 (Build b58g-fcs (09/07/2007))): oracle.toplink.essentials.exceptions.QueryException
Exception Description: The primary key read from the row [DatabaseRecord(
        igf.idigf => null
        igf.instalacao => null
        igf.totalclientes => null
        igf.circuito => RPID  1304
        igf.dataigf => null
        igf.indiceinst => null
        igf.tipoacao => null
Exception in thread "AWT-EventQueue-0" Local Exception Stack: 
Exception [TOPLINK-6044] (Oracle TopLink Essentials - 2.0 (Build b58g-fcs (09/07/2007))): oracle.toplink.essentials.exceptions.QueryException
Exception Description: The primary key read from the row [DatabaseRecord(
        igf.idigf => null
        igf.instalacao => null
        igf.totalclientes => null
        igf.circuito => RPID  1304
        igf.dataigf => null
        igf.indiceinst => null
        igf.tipoacao => null
        igf.ordem => null
        igf.duracao => null
        igf.idrelatoriofalhas => null
        igf.idconjunto => null
        igf.idcidade => null
        igf.idclasse => null
        igf.idclima => null
        igf.idcausa => null)] during the execution of the query was detected to be null.  Primary keys must not contain null.
Query: ResultSetMappingQuery(br.com.bandeirante.persistencia.IGF)
        igf.ordem => null
        igf.duracao => null
        igf.idrelatoriofalhas => null
        igf.idconjunto => null
        igf.idcidade => null
        igf.idclasse => null
        igf.idclima => null
        igf.idcausa => null)] during the execution of the query was detected to be null.  Primary keys must not contain null.
Query: ResultSetMappingQuery(br.com.bandeirante.persistencia.IGF)
        at oracle.toplink.essentials.exceptions.QueryException.nullPrimaryKeyInBuildingObject(QueryException.java:823)
        at oracle.toplink.essentials.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:366)
        at oracle.toplink.essentials.queryframework.EntityResult.getValueFromRecord(EntityResult.java:209)
        at oracle.toplink.essentials.queryframework.ResultSetMappingQuery.buildObjectsFromRecords(ResultSetMappingQuery.java:163)
        at oracle.toplink.essentials.queryframework.ResultSetMappingQuery.executeDatabaseQuery(ResultSetMappingQuery.java:216)
        at oracle.toplink.essentials.queryframework.DatabaseQuery.execute(DatabaseQuery.java:628)
        at oracle.toplink.essentials.queryframework.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:555)
        at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2233)
        at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:952)
        at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:924)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:367)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.getResultList(EJBQueryImpl.java:478)
        at br.com.bandeirante.dao.IGFDAO.FalhasCircuitosCMD(IGFDAO.java:153)
...

Será que alguém tem alguma idéia de como resolver a questão? Obrigado,

celso

1 Resposta

kold_

jcfreire,

Provavelmente a entidade no qual voce quer mapear com a sua consulta nativa, esta sem a identificacao de chave primaria,tente incluir o “@Id” ou esta vindo nulo.

Por exemplo:

@Id
private int codigo;

abraço

Criado 1 de março de 2008
Ultima resposta 3 de mar. de 2008
Respostas 1
Participantes 2