将 java.long 映射到 oracle.Number(14)

Posted

技术标签:

【中文标题】将 java.long 映射到 oracle.Number(14)【英文标题】:Mapping java.long to oracle.Number(14) 【发布时间】:2011-11-30 02:53:14 【问题描述】:

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

Types.BIGINT 会起作用吗? 或者我应该使用其他东西吗?

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

【问题讨论】:

如果您既不能更改数据库也不能更改代码 - 这个问题的目的是什么? 我认为 OP 意味着他们不能同时更改两者,并且想知道应该更改哪一个。不过我可能是错的 【参考方案1】:

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

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

【讨论】:

你能再解释一下吗?您指的是 Types 中的内容吗?【参考方案2】:

从this link 开始,它说java.sql.Types.BIGINT 应该用于Java 中的long 到SQL (Oracle) 中的Number

附上表格的屏幕截图,以防链接失效。

【讨论】:

注意:Integer vs intnullables【参考方案3】:

Hibernate ORM 工具是查找 Java 和 Oracle 类型之间可靠大小映射的好地方。记录 in the code here,Hibernate 使用 Oracle NUMBER(19,0) 来表示一个 java.sql.Types.BIGINT,它应该映射到一个 long primitave

【讨论】:

【参考方案4】:

我有一个类似的问题,我无法修改 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();

其中notifyStateIdparentIdsourceTblsourceIdmsgTypelastUpdatedDateAndTime 都是 MyState 的属性。

如果没有addScalar,我会得到java.lang.IllegalArgumentException: argument type mismatch,因为Hibernate 将Oracle 的Number 类型转换为BigDecimal,但notifyStateIdparentIdLong 上的MyState 类型。

【讨论】:

以上是关于将 java.long 映射到 oracle.Number(14)的主要内容,如果未能解决你的问题,请参考以下文章

Java LONG 整数类型

Java long 没有后缀[重复]

JAVA Long类型可以直接用==比较吗?

java long和java.lang.Long有啥区别?

java long型计算问题

使用 Java Long 包装器与原始 long 相加数字