关于MySQL语句中有IFNULL , 查询结果 返回类型为 [B

    错误语句:

SELECT IFNULL(MAX(xzqhbh)+1,CONCAT('100','01')) as a FROM xzqh WHERE fjxzqhbh ='#'

表结构和数据。
CREATE TABLE `xzqh` (
  `ID` bigint(20) NOT NULL auto_increment,
  `XZQHBH` varchar(255) default NULL COMMENT '行政区划编号',
  `FJXZQHBH` varchar(255) default NULL COMMENT '父级行政区划编号',
  `XZQHMC` varchar(255) NOT NULL COMMENT '行政区划名称',
  `XZQHDM` varchar(10) NOT NULL COMMENT '行政区划代码',
  `XZQHJB` tinyint(4) default NULL COMMENT '0总局 1省 2市 3县 4乡镇 5村',
  `XZQHMS` varchar(255) default NULL COMMENT '行政区划描述',
  `XZQHPX` int(10) default NULL COMMENT 'jsTree所用到的属性(默认为空)',
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=259 DEFAULT CHARSET=utf8 COMMENT='行政区划表';

/*Data for the table `xzqh` */

insert  into `xzqh`(`ID`,`XZQHBH`,`FJXZQHBH`,`XZQHMC`,`XZQHDM`,`XZQHJB`,`XZQHMS`,`XZQHPX`) values (1,'-1','#','中国','000000',0,NULL,7);



贴上异常:

java.lang.ClassCastException: [B cannot be cast to com.jfinal.plugin.activerecord.Record
	at com.askj.zs.xzqh.model.Xzqh.addByPar(Xzqh.java:82)
	at com.askj.zs.xzqh.controller.XzqhController.xzqhTreeSave(XzqhController.java:73)
	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:73)
	at com.jfinal.ext.interceptor.SessionInViewInterceptor.intercept(SessionInViewInterceptor.java:44)
	at com.jfinal.aop.Invocation.invoke(Invocation.java:67)
	at com.jfinal.core.ActionHandler.handle(ActionHandler.java:74)
	at com.jfinal.ext.handler.ContextPathHandler.handle(ContextPathHandler.java:47)
	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:218)
	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:169)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1083)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:640)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2517)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2506)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)	
	
	
出错误处的源码:
<T> List<T> query(Config config, Connection conn, String sql, Object... paras) throws SQLException {
    ArrayList result = new ArrayList();
    PreparedStatement pst = conn.prepareStatement(sql);
    config.dialect.fillStatement(pst, paras);
    ResultSet rs = pst.executeQuery();
    int colAmount = rs.getMetaData().getColumnCount();
    if(colAmount <= 1) {
        if(colAmount == 1) {
            while(rs.next()) {
                result.add(rs.getObject(1));
            }
        }
    } else {
        while(rs.next()) {
            Object[] temp = new Object[colAmount];

            for(int i = 0; i < colAmount; ++i) {
                temp[i] = rs.getObject(i + 1);
            }

            result.add(temp);
        }
    }

    DbKit.close(rs, pst);
    return result;
}


result.add(rs.getObject(1));  result里面的值就已经错了。以为是JDBC的问题,但是我自己写JDBC查询方法,是没问题的。


评论区

翟进博

2016-11-25 09:31

用了 DB的 一系列query方法 和 findFirst 等。 都不行,类型转换提示 [B cannot be cast to。。。

l745230

2016-11-25 09:49

SELECT IFNULL(MAX(xzqhbh)+1,CONCAT('100','01')) * 1 as a FROM xzqh WHERE fjxzqhbh ='#' 试了一下 加个 * 1

翟进博

2016-11-25 10:16

@l745230 确实能解决,可是这条SQL正常在数据库里执行起来是没问题的,而且我们用自己对JDBC封装的方法查询是没问题的。用Jfinal 的DB就不行。。。

l745230

2016-11-25 10:32

@翟进博 具体原理我也不懂..之前也遇到类似问题,春哥帮忙解决的, 试了好多方式,最后 加了*1搞定.

l745230

2016-11-25 10:36

@JFinal 波总,有位大兄弟也遇到这个问题了.

JFinal

2016-11-25 10:50

贴子中的异常没有定位到 jfinal 源码中的具体方法和代码行,只定位到了你的业务代码:at com.askj.zs.xzqh.model.Xzqh.addByPar(Xzqh.java:82)
所以无法确定问题,请贴出在异常在 jfinal DbPro.java 源码中发生的地点

JFinal

2016-11-25 11:15

@翟进博 能否贴出具体的代码来,直接修改这个贴子即可

JFinal

2016-11-25 11:24

@翟进博 这个就奇怪了,ArrayList 没有用泛型,是什么都可以放进去的,感觉还得再仔细调试一下,寻找确切原因,你那里难得重现这个问题,麻烦帮忙确定原因,然后试着改改代码,看能否解决,再反馈给社区

l745230

2016-11-25 11:39

@JFinal 放进去的是byte字节型.

翟进博

2016-11-25 11:43

@l745230 是的, result结果里面显示的是Byte

翟进博

2016-11-25 11:44

@JFinal 帖子已经修改。

l745230

2016-11-25 11:58

@翟进博 addByPar(Xzqh.java:82)中,调用Db的部分,代码贴出来下

翟进博

2016-11-25 12:38

@JFinal 已经发现此类问题出现的原因了,Mysql数据库版本的问题,项目用的数据库是5.09X版本的,mysql jar包版本为5.1.2 出现了此错误。 同样的方法,更换为5.5版本的数据库,问题解决。应该是 jar包驱动和数据库版本不匹配导致的。

翟进博

2016-11-25 12:38

@l745230 已经发现此类问题出现的原因了,Mysql数据库版本的问题,项目用的数据库是5.09X版本的,mysql jar包版本为5.1.2 出现了此错误。 同样的方法,更换为5.5版本的数据库,问题解决。应该是 jar包驱动和数据库版本不匹配导致的。 谢谢!辛苦了!

JFinal

2016-11-25 13:47

@翟进博 非常感谢能回来分享这个问题的原因 ^_^

puhaiyang

2018-03-26 16:16

确实是mysql版本问题,我这里在5.7可也行,5.1上也返回了二进制。后面为了mysql版本兼容性,由ifnull换为了case when语句解决了

热门反馈

扫码入社