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