Tuve un problema similar en el que no pude modificar el tipo de Java o el Tipo de base de datos En mi situación, necesitaba ejecutar una consulta SQL nativa (para poder utilizar las habilidades de consulta recursiva de Oracle) y asignar el conjunto de resultados a una entidad no gestionada (esencialmente una clase de pojo simple).
Encontré una combinación de addScalar y setResultTransformer trabajados maravillas.
hibernateSes.createSQLQuery("SELECT \n"
+ " c.notify_state_id as \"notifyStateId\", \n"
+ " c.parent_id as \"parentId\",\n"
+ " c.source_table as \"sourceTbl\", \n"
+ " c.source_id as \"sourceId\", \n"
+ " c.msg_type as \"msgType\", \n"
+ " c.last_updt_dtm as \"lastUpdatedDateAndTime\"\n"
+ " FROM my_state c\n"
+ "LEFT JOIN my_state p ON p.notify_state_id = c.parent_id\n"
+ "START WITH c.notify_state_id = :stateId\n"
+ "CONNECT BY PRIOR c.notify_state_id = c.parent_id")
.addScalar("notifyStateId", Hibernate.LONG)
.addScalar("parentId", Hibernate.LONG)
.addScalar("sourceTbl",Hibernate.STRING)
.addScalar("sourceId",Hibernate.STRING)
.addScalar("msgType",Hibernate.STRING)
.addScalar("lastUpdatedDateAndTime", Hibernate.DATE)
.setParameter("stateId", notifyStateId)
.setResultTransformer(Transformers.aliasToBean(MyState.class))
.list();
Dónde notifyStateId
, parentId
, sourceTbl
, sourceId
, msgType
, y lastUpdatedDateAndTime
son todas las propiedades de MyState
.
Sin los addScalar
's, me gustaría tener un java.lang.IllegalArgumentException: argument type mismatch
porque Hibernate se estaba convirtiendo de Oracle tipo Number
en un BigDecimal
pero notifyStateId
y parentId
se Long
tipos de MyState
.
Si no puede cambiar ni la base de datos ni el código, ¿cuál es el propósito de la pregunta? –
Creo que OP significaba que no podían permitirse el lujo de cambiar ambos y se preguntaba cuál debería cambiarse. Podría estar equivocado, aunque – Mike