Hibernate SQLQuery查询返回空List,在mysql命令下直接执行sql语句可以正常得到记录

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sxl1993/article/details/50463272

遇到的问题如标题所述。

用Hibernate的SQLQuery来list记录,

背景:

1、前一天还能正常返回数据,今天就不可以用了,代码绝对没有变动过

2、是多表查询,且在where条件中还使用了select查询(就这样套了很多层)。

3、以为是多表联查有问题,百度之~没有解决,Google之~没有解决+1,但有人说用hibernate的save方法加条数据就能查到了,但是感觉不大对,所以没有尝试。

4、捣鼓brew,但是brew update失败,所以把brew给uninstall了,mysql是用brew安装的,所以重新安装了mysql5.7数据库。

解决过程:

1、把拼接的SQL语句全部注释掉,写了一个超级简单的查询(SELECT * FROM 表名),用以确认拼接SQL以外的代码没有问题。(测试通过)

2、把SQL语句从最内层开始,一层一层的加到代码中,其中有一层,是根据城市名来获取区域的ID(这里会传入城市名称,汉字的形式),这一层没有通过(简称A层);继续尝试拼接其它层,反正A层只是负责查出一个ID,索性暂时把A层的语句删掉,用一个数字来顶替,发现其它层都能正常运行下去,能返回数据。(所以是A层出的问题)

3、在控制台检查SQL输出,没有发现乱码。

4、把参数值直接硬编码到代码中,在硬编码附近多写一个括号(左括号右括号无所谓,就是要引出SQL异常),发现硬编码的"北京市"三个字变成了问号。(有些眉目了,应该是编码问题)

5、检查配置文件,均为utf-8,代码文件编码也是utf-8;

6、基本可以确定是数据库编码出错了。进入mysql命令,执行这一句来查编码。

show variables where Variable_name like 'character%';

7、果然,重新安装之后光顾着把数据导回来,忘了设置默认编码了,现在默认的是latin编码,这就好解决了,关掉mysqld。

8、修改my.cnf配置文件,在[mysqld]下面加上这几行(低版本的mysql需要加这个 -> default-characer-set=utf8,高版本的不要加,会报错,具体低到哪个版本才需要加这一句我不太清楚,貌似是5.5?)

character-set-server = utf8
collation-server = utf8_general_ci
init_connect = 'SET collation_connection = utf8_general_ci'
init_connect = 'SET NAMES utf8'
9、修改成功后启动mysqld服务。

10、启动Tomcat,重新走这段代码,可以正常返回数据了。


总结:

元旦在火车上把脑子丢了。。。导致重装数据库后忘了修改数据库编码。Orz...

展开阅读全文

没有更多推荐了,返回首页