Jfinal啥时候完美支持Oracle、sqlserver等库数据类型

Role 发布于 2015/09/29 16:48
阅读 777
收藏 0

@JFinal 你好,想跟你请教个问题:现在公司这边主要用oracle和sqlserver库,使用JFinal 2.0做项目遇到数据类型转换错误,排查发现,jfinal对支持以上库的数据型转换错误“java.math.BigDecimal cannot be cast to java.lang.Long”,不知道有什么解决方法,还有啥时能够在新版本中解决这些问题。

详细错误:

java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Long
at com.jfinal.plugin.activerecord.DbPro.queryLong(DbPro.java:178)
at com.eova.common.base.BaseModel.isExist(BaseModel.java:198)
at com.eova.model.MetaObject.isExistQuery(MetaObject.java:97)
at com.eova.template.single.SingleController.list(SingleController.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.jfinal.aop.Invocation.invoke(Invocation.java:71)
at com.eova.interceptor.LoginInterceptor.intercept(LoginInterceptor.java:54)
at com.jfinal.aop.Invocation.invoke(Invocation.java:65)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:74)
at com.jfinal.plugin.druid.DruidStatViewHandler.handle(DruidStatViewHandler.java:75)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
加载中
1
JFinal
JFinal

   这是一个讨论过多次的问题,jfinal 从 jdbc 中获取到数据以后,没有经过任何类型转换(Blob、Clob除外),保存在 Model、Record 中的属性具体是什么类型完全由 jdbc 决定。

   进一步来看类型问题,在 JDBC 规范中,Java 数据类型与数据库字段类型存在对应关系,例如Java 的 Integer 对应 mysql 字段的 integer,Java的Date对应mysql字段的 datatime。但这个对应关系不仅与字面上的意思有关,还与以下两个因素有关:

1:sql 中使用了 count(...) 或 sum(...)这样的函数,例如 select sum(money) from account这样的 sql,虽然 money 在数据库中的字段类型是 integer,但得出来的结果在 jdbc中会被自动转化成 Long 型,因为要考虑 integer 在相加以后再放入 Integer 类型的变量时会出现数值溢出。

2:改变数据库字段的长度,也能引发jdbc 将低长度的类型自动转成高长度的类型。例如 mysql 的 tinyint 字段类型,在长度为1时,jdbc 会自动将tinyint(1)给转成java的 Boolean,长度大于 1 时将转成java的 Integer

   以上转换是 jdbc 的合理行为,是为了防止数值溢出,jfinal 不方便干预,所以需要开发者对于数据类型心中有数,合理使用Model、Record的不同 getter 方法来获取数据。

1
如梦技术
如梦技术
queryLong 波总的建议是 Db.queryNumber(sql).longValue()
1
Role
Role

引用来自“JFinal”的评论

   这是一个讨论过多次的问题,jfinal 从 jdbc 中获取到数据以后,没有经过任何类型转换(Blob、Clob除外),保存在 Model、Record 中的属性具体是什么类型完全由 jdbc 决定。

   进一步来看类型问题,在 JDBC 规范中,Java 数据类型与数据库字段类型存在对应关系,例如Java 的 Integer 对应 mysql 字段的 integer,Java的Date对应mysql字段的 datatime。但这个对应关系不仅与字面上的意思有关,还与以下两个因素有关:

1:sql 中使用了 count(...) 或 sum(...)这样的函数,例如 select sum(money) from account这样的 sql,虽然 money 在数据库中的字段类型是 integer,但得出来的结果在 jdbc中会被自动转化成 Long 型,因为要考虑 integer 在相加以后再放入 Integer 类型的变量时会出现数值溢出。

2:改变数据库字段的长度,也能引发jdbc 将低长度的类型自动转成高长度的类型。例如 mysql 的 tinyint 字段类型,在长度为1时,jdbc 会自动将tinyint(1)给转成java的 Boolean,长度大于 1 时将转成java的 Integer

   以上转换是 jdbc 的合理行为,是为了防止数值溢出,jfinal 不方便干预,所以需要开发者对于数据类型心中有数,合理使用Model、Record的不同 getter 方法来获取数据。

谢谢!波总
0
Role
Role

引用来自“孤独的3”的评论

queryLong 波总的建议是 Db.queryNumber(sql).longValue()
谢谢!
0
百世经纶之傲笑红尘
百世经纶之傲笑红尘
看来学习框架应该活学活用,切勿死搬死套,同时这也从侧面反应了@JFinal本人的扎实技术功底
0
Role
Role
波总处理让咱们JFinal在如下数据库中工作良好:H2、MySql、Oracle、Postgresql、Sql Server 2005~12、Sql Server 2000以及DB2
返回顶部
顶部