将 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 int
和 nullables【参考方案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();
其中notifyStateId
、parentId
、sourceTbl
、sourceId
、msgType
和 lastUpdatedDateAndTime
都是 MyState
的属性。
如果没有addScalar
,我会得到java.lang.IllegalArgumentException: argument type mismatch
,因为Hibernate 将Oracle 的Number
类型转换为BigDecimal
,但notifyStateId
和parentId
是Long
上的MyState
类型。
【讨论】:
以上是关于将 java.long 映射到 oracle.Number(14)的主要内容,如果未能解决你的问题,请参考以下文章