开发者社区> 问答> 正文

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-22 23:10:06 579 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

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

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

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

      贴出你的sql语句

    ######如果能够灵活转换就好。######SQL语句:RecordaccountByEmail=Db.findFirst("select*fromaccountwhereemail=?",email);######我也遇到了,这个<spanstyle="color:#FF6600;font-family:微软雅黑,Verdana,sans-serif,宋体;line-height:normal;background-color:#FFFFFF;">record.getInt("id")返回的数据,听你们说的,不是我们能确定的。。######解决方法是将接收值设置为Long吗?######<divclass="ref">

    引用来自“hanzhankang”的答案

    <divclass="ref_body">解决方法是将接收值设置为Long吗?<divclass="a_body">

    请看这里:

    <arel="nofollow">http://www.oschina.net/question/924197_128359

    2020-06-22 23:10:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载
云时代的数据库技术趋势 立即下载
超大型金融机构国产数据库全面迁移成功实践 立即下载