Отображение java.long к оракулу. Числа (14) - PullRequest
8 голосов
/ 03 октября 2011

У меня есть столбец БД с типом данных Number (15), и у меня есть соответствующее поле в классах Java как long .Вопрос в том, как бы я отобразил его, используя java.sql.Types .

  • будет работать Types.BIGINT?
  • Или я должен использовать что-то еще?

PS: я не могу позволить изменить тип данных в Javaкласс и внутри БД.

Ответы [ 4 ]

10 голосов
/ 03 октября 2011

С по этой ссылке говорится, что java.sql.Types.BIGINT следует использовать для long в Java и Number в SQL (Oracle).

Прикрепление скриншота таблицы на случайссылка когда-либо умирает.

SQL and JDBC datatypes

5 голосов
/ 18 июля 2012

Хорошее место для поиска надежных сопоставлений размеров между типами Java и Oracle - инструмент Hibernate ORM. Документированный в коде здесь , Hibernate использует Oracle NUMBER (19,0) для представления java.sql.Types.BIGINT, который должен отображаться на длинный примитив

0 голосов
/ 13 марта 2013

У меня была похожая проблема, когда я не мог изменить тип Java или тип базы данных.В моей ситуации мне нужно было выполнить собственный запрос SQL (чтобы иметь возможность использовать возможности рекурсивного запроса Oracle) и сопоставить результирующий набор с неуправляемой сущностью (по сути, простым классом pojo).

Я нашелкомбинация addScalar и setResultTransformer сотворенных чудес.

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();

Где notifyStateId, parentId, sourceTbl, sourceId, msgTypelastUpdatedDateAndTime - все свойства MyState.

Без addScalar я получил бы java.lang.IllegalArgumentException: argument type mismatch, потому что Hibernate превращал тип Oracle Number в BigDecimal, но notifyStateId и parentId являются Long типами на MyState.

0 голосов
/ 03 октября 2011

Я всегда использую тип обертки, потому что типы обертки могут быть выражены нулевыми значениями.

В этом случае я буду использовать длинный тип обертки.

...