开发者社区> 问答> 正文

JFinal Record 取的数据库类型与实际不符? 400 报错

JFinal Record 取的数据库类型与实际不符? 400 报错

 @JFinal JFinal 1.3 版本, 有一张mysql 表,定义的字段 id 为 int 型,是数据库的关键字段和自增长字段

CREATE TABLE `account` (
   `id` int(5) NOT NULL AUTO_INCREMENT,
  `email` varchar(30) DEFAULT NULL,

)

在使用 record.get("id") 取出来的id 类型是long型,导致转换出错.

public static String generateActivateLink(Record record) {
            int id = record.get("id");

}

存储record的代码如下

Record account = new Record();
		
		account.set("email", email).set("password", encrypt_password)
				.set("name", name).set("sex", sex).set("city", city)
				.set("date_join", date_join).set("last_login", last_login)
				.set("online", true)
				.set("activate", CareConst.ACCOUNT_STATUS_DEACTIVATE)
				.set("randomCode", UUID.randomUUID());
		Db.save("account", account);


展开
收起
爱吃鱼的程序员 2020-06-02 14:14:16 676 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    Record 应该有一个 getInt() 方法就好,不知道有没有######record.getInt("id")会报转换错误######有啊######int id = record.getInt('id');######java.lang.Long cannot be cast to java.lang.Integer at com.jfinal.plugin.activerecord.Record.getInt(Record.java:170)######idint(20) NOT NULL AUTO_INCREMENT 这句被你改成 idint(5) NOT NULL AUTO_INCREMENT, 错误还在吗? 一般是 int(11)######错误还在######jfinal诸如getInt(),getDouble()和jdbc中ResultSet的getInt()不同,后者你这样用可以,他直接以int返回。但是前者实际上是(Integer)getObject()的封装,而getObject()是返回默认的类型,所以mysql int默认是返回Long类型的,你这样就错了。所以解决方法是getLong("columnname")。
    ######回复 @nginx困惑 : 我好像说错了,不同数据库sql类型到java类型应该是一样的,mysql 的int应该是对应java的int.bigint才是long。而且jfinal的源码上也标明了说getInt()获取mysql的int ,smallint等。######回复 @nginx困惑 : 这个不同数据库默认类型不一样的,你只能试试了。而且现在orm只是为了面向对象操作数据库,一般很少跨数据库的。你的数据库又不会变来变去。######回复 @Burning_BL :我数据库定义的是int,返回的是long,这个我取列是知道数据库类型,但像我现在遇到的问题,我只知道数据库定义是int型,但我不知道数据库返回的会不会是Long型的。######回复 @nginx困惑 : 没办法的,jfinal是这样封装的。id一般都用Long的,而且你取列的时候肯定知道是什么sql类型,然后用对应的java类型接收就行。比如如果sql是double,float,你就用Double,如果是decimal,就用BigDecimal,具体对应方式请百度。######因为我mysql数据库定义的是int类型,mysql返回long超出了我预知的范围######

        mysql 数据库字段设置为 int(5),单纯取数据应该是 Integer 型,但 sql 语句可以导致这个字段值会变成 Long,例如: select sum(id).....,又如 select count(id),对 int 型字段进行运算返回了Long型值是为了防止数值溢出。

        JFinal仅仅是从JDBC的ResultSet中取值,并没有对数据进行转换(Blob、Clob灰型除外),所以弄清楚JDBC返回了什么类型就可以。

        贴出你的 sql 语句

    ######如果能够灵活转换就好。######SQL语句 : Record accountByEmail = Db.findFirst("select * from account where email=?",email);######我也遇到了,这个 record.getInt("id") 返回的数据,听你们说的,不是我们能确定的。。######解决方法是将接收值设置为Long吗?######

    引用来自“hanzhankang”的答案

    解决方法是将接收值设置为Long吗?

    请看这里:

    http://www.oschina.net/question/924197_128359

    2020-06-02 14:14:32
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
阿里云数据库案例集下载 立即下载
阿里云数据库产品手册 立即下载
\"中国人的数据库分支——ApsaraDB AliSQL开源思路 \" 立即下载