2011-10-03 11 views
6

Tengo una columna db cuyo tipo de datos es Number (15) y tengo el campo correspondiente en clases java como long. La pregunta es cómo lo mapearía usando java.sql.Types.Asignando java.long a oracle.Number (14)

  • escribiría Types.BIGINT?
  • ¿O debo usar algo más?

P.S: No puedo permitirme cambiar el tipo de datos dentro de la clase Java y dentro de DB.

+0

Si no puede cambiar ni la base de datos ni el código, ¿cuál es el propósito de la pregunta? –

+0

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

Respuesta

0

Siempre utilizo el tipo de envoltura, porque los tipos de envoltorio pueden expresar valores nulos.

En este caso usaré el tipo de envoltura larga.

+0

¿me puede explicar un poco más? ¿Te refieres a algo en Types? –

8

De this link se dice que java.sql.Types.BIGINT se debe usar para long en Java para en SQL (Oracle).

Adjuntando la captura de pantalla de la tabla en caso de que el enlace muera alguna vez.

SQL and JDBC datatypes

+0

Nota: 'Entero' *** vs ***' int' y *** nullables *** – Kiquenet

5

Un buen lugar para encontrar las asignaciones de tamaño fiables entre Tipos Java y Oracle se encuentra en la herramienta Hibernate ORM. Documentado in the code here, Hibernate usa un NÚMERO de Oracle (19,0) para representar un java.sql.Types.BIGINT que debe correlacionarse con una primitave larga

0

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.

Cuestiones relacionadas