Hibernate JdbcTemplate的queryForInt的些许问题

Posted 杨晨光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate JdbcTemplate的queryForInt的些许问题相关的知识,希望对你有一定的参考价值。

      最近,在项目中,所做的模块中,一个特别简单的逻辑问题,搞完之后,控制台居然报错了。这可不是我所能容忍的,静下心来,返回去,好好看了看,这个Bug。


重现Bug




需求描述

       前台需要上传一些文件,首先需要判断文件是否已经存在在数据库中。根据返回的值来判断,1代表存在,不添加;0代表不存在,可以添加。

既然这样,感觉那就好办了,去数据库中查,有记录的话,肯定返回不是null。没有的话,返回null,然后返回就行了。一开始,我定义了一个Int类型的,心想,也就一个数字,就Int吧。一执行,虽然可以成功,但是后台报错了。

spring的javadoc上讲getObject(String, Object[], Class) will return NULL if the result of the query is NUL
这里有0行和nullresult的区别
0行: select name from user where 1 = 2
null result: select max(salary) from user where 1 = 2 返回就是null
0行一定抛出IncorrectResultSizeDataAccessException异常

原因如下

ResultSetMetaData rsmd = rs.getMetaData();
int nrOfColumns = rsmd.getColumnCount();这里返回ResultSet的列数
  if (nrOfColumns != 1)
   throw new IncorrectResultSizeDataAccessException(
     "Expected single column but found " + nrOfColumns, 1, nrOfColumns);
  
0行,多于1行,就抛异常了。最好还是用QueryForList,返回的list的size为0,就是0行。

最后,改为List,就OK了。



        遇到Bug,虽然能马上解决,但是,还是要多思考,多想想。


以上是关于Hibernate JdbcTemplate的queryForInt的些许问题的主要内容,如果未能解决你的问题,请参考以下文章

jdbc ,jdbcTemplate,MyBatis,Hibernate比较与分析

spring boot 集成 jpa+hibernate+jdbcTemplate

如何配置 Spring 使 JPA(Hibernate)和 JDBC(JdbcTemplate 或 MyBatis)共享同一个事务

使用 Spring boot 嵌入式 tomcat 连接池,无需 jdbctemplate、hibernate 或 JPA

Hibernate JdbcTemplate的queryForInt的些许问题

Spring的jdbcTemplate 与原始jdbc 整合c3p0的DBUtils 及Hibernate 对比