9

我有数据类型为 Number (15) 的 db 列,并且我在 java 类中有对应的字段long。问题是我将如何使用java.sql.Types映射它。

  • Types.BIGINT 会起作用吗?
  • 还是我应该用别的东西?

PS:我无法更改 java 类和 DB 中的数据类型。

4

4 回答 4

12

From this link it says that java.sql.Types.BIGINT should be used for long in Java to Number in SQL (Oracle).

Attaching screenshot of the table in case the link ever dies.

SQL and JDBC datatypes

于 2011-10-03T18:49:27.040 回答
5

在 Hibernate ORM 工具中查找 Java 和 Oracle 类型之间的可靠大小映射的好地方。在此处的代码中记录,Hibernate 使用 Oracle NUMBER(19,0) 来表示应该映射到长原始数据的 java.sql.Types.BIGINT

于 2012-07-18T15:59:48.663 回答
0

我总是使用包装器类型,因为包装器类型可以表示空值。

在这种情况下,我将使用 Long 包装器类型。

于 2011-10-03T17:52:32.637 回答
0

我有一个类似的问题,我无法修改 Java 类型或数据库类型。在我的情况下,我需要执行原生 SQL 查询(以便能够利用 Oracle 的递归查询能力)并将结果集映射到非托管实体(本质上是一个简单的 pojo 类)。

我发现addScalarsetResultTransformer的组合创造了奇迹。

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's,我会得到 ajava.lang.IllegalArgumentException: argument type mismatch因为 Hibernate 将 Oracle 的Number类型变成了BigDecimalbutnotifyStateId并且parentIdLong类型 on MyState

于 2013-03-12T20:43:03.977 回答