Mysql 下使用Db.find(sql),count(1) 返回结果被转成Byte类型的解决方式

mysql、druid、jfinal2.2、fastjson 1.2.16

下午在写接口,返回未读消息,遇到了这个问题,

List<Record> recordList = Db.find(sql,sysUserId);
(CASE b.channel_type_id
 WHEN 5
   THEN
     (SELECT count(1)
      FROM t_intercity_trip c
      WHERE c.sys_user_id = a.sys_user_id
            AND c.create_time > a.update_time)
 WHEN 6
   THEN
     '上下班顺风车'
 ELSE
   '44444'
 END)             unRead,

返回结果

CFAA3760-A42F-460C-9F04-6EC62EB37D37.png

2A4CCD9B-48D4-4DA5-A167-FB0CE0A29567.png

然后就开始了各种尝试-。-

DC601AB8-B545-47FA-BB7B-DD17BCB6CA57.png首先是切换成默认的jackson、jfinaljsonFactory. 结果unRead依然是byte类型。


2.之后就开始想把结果全部遍历一下,遍历到unRead这个字段,重新赋值成int类型

List<Map<StringObject>> (List<Record> recordsString... columns) {
    String changeColumns = (String column : columns) {
        changeColumns += column}
    List<Map<StringObject>> list = ArrayList<>()(Record record : records) {
        Map<StringObject>  columnsMap = record.getColumns()(String key : columnsMap.keySet()){
            (changeColumns.indexOf(key) != -){
                columnsMap.put(key()columnsMap.get(key))}
        }
        list.add(columnsMap)}
    list}

报错 B cannot be cast to java.lang.Integer. 

折腾许久之后无果,跑到群里求大腿help~~


在Dreamlu大神的耐心指导下,最终到sql中做点文章

首先使用cast的方式

select cast(11 as unsigned int) 

select cast(11 as decimal(10,2))

结果druid报错,发现sql注入了... 原SQL的基础上就在count(1)外面套了个cast...

druidPlugin.setFilters("stat,wall");

druid就配置了这个,然而为什么说sql注入也是不懂..在换了好几个地方套cast之后,放弃了这个做法..

81CA0A4C-30A3-4559-9F7E-D8A0E48C538B.png


然后Dreamlu让我这样

blob.png



结果居然可以了!!! 

结果居然可以了!!! 

结果居然可以了!!! 


真是太神奇了!没想到写了辣么多代码,最终 *1 就能解决..


blob.png

再次再次感谢jfinal提供了这么好用的框架~~,感谢Dreamlu的耐心指导~~

评论区

JFinal

2016-08-31 17:57

具体的 sql 是怎么样的? 相应的数据表字段如果是 tinyint(1) 建议改为 tinyint(2),因为 jdbc 会将 tinyint(1) 自动转换为 boolean 类型,但也不会是 Byte 型

l745230

2016-08-31 18:21

@JFinal 第一次写分享.. 按了command+回车,才写了个标题文章就发出去了..

JFinal

2016-08-31 19:00

感谢你的分享,内容可以随时修改的,所以提交后不用担心, ctrl + 回车就可以提交是为了让用户体验更好,回贴的功能也是可以 ctrl + 回车快捷回复的。
虽然问题是解决了,但是为啥会是 byte 类型呢? 是不是 tinyint(1) 引发的,此外,用 count(*) 有没有问题?

l745230

2016-09-01 09:43

试了一下,count(*) 跟count(1)都是返回byte类型。

JFinal

2016-09-01 10:08

@l745230 这个字段的类型是什么?

l745230

2016-09-01 11:45

@JFinal 并不是查表字段, 类似统计某张表一共有多少条数据这样使用,SELECT (SELECT count(1) FROM table) total

JFinal

2016-09-01 12:04

@l745230 即便是这样的查询也最终可以追溯到某个字段,因为 select count(1) 是针对这个 sql 得到的第一个字段进行的 count 操作
所以根据后面的 FROM t_intercity_trip c 就可以知道这个 count(1) 是指 t_intercity_trip 表的第一个字段,找到这个字段,看下它的类型就知道原因了

JFinal

2016-09-01 12:07

我猜测 t_intercity_trip 第一个字段的类型不是普通的 int、varchar 之类的,很可能是这些类型的一种:binary, varbinary, tinyblob, blob, mediumblob, longblob

l745230

2016-09-01 14:33

t_intercity_trip表的第一个字段设计的是 trip_id bigint(20) NOT NULL AUTO_INCREMENT, PRIMARY KEY (trip_id)

热门分享

扫码入社