hibernate执行sql语句出现了一个很恼人的问题,控制台有时候不输出!特别的离奇!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate执行sql语句出现了一个很恼人的问题,控制台有时候不输出!特别的离奇!相关的知识,希望对你有一定的参考价值。

String hql = "from Server s where s.status = '1' and (s.masterIp = '' or s.masterIp is NULL)";
List<Server> list = new ServerDaoImpl().findServerByHQL(hql);
System.out.println(list.size());
if(list.size()>0)
System.out.println("aaa");
else
System.out.println("bbb");

上面是我的代码。执行十几次list.size()就有不输出的时候。有时候list.size是大于零也输出了,但是下面的if和else都没有执行输出。太郁闷了!这种情况都是很少,就是不知道为什么,要在程序里出现这个情况,那就悲剧了!谁帮帮我啊??

参考技术A List<Server> list = (List<Server>)new ServerDaoImpl().findServerByHQL(hql);
我建议你强制做个转化吧,你这些程序是没有问题的!追问

为什么,返回类型本来就是那个,但是强专了以后不出那个问题了,怎么回事??

追答

你这里如果用的是hibernate的话,那就要强制转换,强制转换其实应该在你的 ServerDaoImpl里面return的时候就应该转换了!
至于为什么这样做,我的理解是,hibernate的虽然返回的是List对象,但是List里面存放的实际上是Object对象!所以....

追问

@SuppressWarnings("unchecked")
@Override
try
serverList = (List) baseDAO.getObjectsByHQL(hql,entities);
catch (EXP_Base e)
e.printStackTrace();

这是我的dao实现,也强转了,我刚才把强转去掉了试了好多遍也没出那个问题,太离奇了!

追答

。。。。

参考技术B 我也出现过这种情况,忘记是怎么解决的了,你用debug调试一下应该就知道了。本回答被提问者采纳 参考技术C 猪头啊,缓存的问题,清理一下你的项目追问

哥们真搞,缓存问题还不保留上次结果反而出现其他结果了??????不懂别瞎掰!

参考技术D 把你的工程clean一下试试。追问

还有 我是在main方法里做的测试,和项目本身没有关系!

追答

看看是不是哪个地方出异常了,但异常又没有打印。例如hibernate本身会记录一些日志,因为你用的main, 所以你的日志没有配。

追问

我自己感觉应该是eclipse的问题吧,和hibernate无关,因为这样执行得到了我想要的结果了,但是有时候就是不打印,就像有一个都打印出来list.size的长度为3了,但是if和else里面的东西就是没有输出!

追答

一般情况下,如果是eclipse的问题,你clean后,eclipse会重新编译文件,问题往往就解决了。你可以一步步调试一下。我觉得应该是类似上面我说的异常的情况。放到工程里不会出现这样的问题。是你用main做测试引起的。

追问

日志的记录也是在异常处理时进行的吧,调试没有异常,就是一个单纯的查询

追答

不能再追问了,否则要扣分的。
建议你把代码在工程中测试,不会出现这个问题的,或者用junit从action处开始测试。

追问

扣分就扣吧,我就怕项目中出现这个问题,到时候本应该长度大于零做的操作都没做就悲剧了!其实在哪里都一样,我在试试吧!

追答

没想到,类型转换! 不应该引起这个问题啊..

mybatis的搭建和注入spring的方式

mybatis实际上是一个更多关注sql语句的框架,他的出现是想让开发者更简单的去操作数据库。

与hibernate相比较,hibernate更多的是去sql化,虽然hibernate也可以本地sql执行,hibernate更多的是关注与hql的编写和对象映射的配置,

只要配置完了,hibernate有封装好的函数可以帮你执行操作数据库,当然hibernate也是靠生产sql语句去实现操作数据库的,值得注意的是

hibernate可以很容易的去适应不同类别的数据库,只要配置更改一下就可以针对不同的数据库生产不一样的sql语句,hibernate的难点可能集中

于单双边和几对几po对象的配置问题。所以说一定程度上来说hibernate掌握的门槛可能比mybatis要高一些。

回过头来,mybatis相对Hibernate“O/R”而言,mybatis是一种“Sql Mapping”的ORM实现。

你只需要再mybatis的对象映射文件xml中写好自己的sql语句,并同时配置好入参和返回值类型,那么mybatis就可以帮你po对象存到数据库或者

将数据库的数据映射到对象来,那么在使用mybatis的时候其实主要工作就是写sql了,然后就是一些配置规则的细枝末节。

 

今天我们要搭建mybatis,并顺便整合到我们spring项目中,spring项目就是我之前的博客中《springMvc+hibernate的web application的构建》所构建成功的项目。

1mybatis当然少不了响应的jar包,3.2.7是我下载的jar包,当然不是最新的,最新我找了很久,有的是因为jar下载的链接卡住了,有的是因为csdn上下载的积分和c币用光了。

下图是我下载的jar包。

因为咱们这个spring项目是web项目,直接丢到webContent下的lib里面就好,既可以在application中的main函数执行,也可以再web服务器中运行,就很舒服。

然后在项目的src下放入我们的配置文件,配置文件如下:

配置文件的位置如下:

 

可以看到分为两部分,一部分是关于连接数据库的,另一部分是关于po配置的xml文件。

当然mybatis也需要jdbc.driver的,然后po的xml会稍后展示。

 

现在我们需要做的是建立好数据库的表,以及po类的建立,以及po对应下xml配置问题。

我们一个个来看下:

 

 

 那么,现在大家就可以看见了,通过参数类型的定义,返回值类型的定义,我们在其他地方调用这个sql语句的时候就

可以实现我们的数据库操作了。

 

不过在执行这个操作的时候,我们应该先初始化好mybatis的配置文件,以便加载mybatis。

这个时候我们的下面代码就可以做到了:

当我们初始化好后,就可以做我们想要的操作了。

 

那新的问题又来了,我们如何将这个mybatis融入到我们的项目中呢?

其实方法有两种,

1因为我们这个是spring项目,所以可以再spring的配置文件中加入这个MybatisOfSpringUtil类,之后需要的时候就可以通过

spring的上下文对象getBean方法获得了。

2也就是我使用的方式,从上面的这个方法可以看到sqlSessionFactory这个变量是静态的,且实现了单例模式的。直接在要使用的

地方调用MybatisOfSpringUtil.getSessionFactory()就好。不需要将这个类注入到spring中。

其实两种方法都是可以的,一个是靠注入spring项目的时候初始化mybatis的配置文件,一个是靠第一次调用MybatisOfSpringUtil.getSessionFactory()

的时候去初始化mybatis配置文件。

 

当我们初始化好后,就可以在需要的时候调用了,也就意味在自己的项目中加好了mybatis框架。

我的调用是方式是:

当然这款代码是dao层的代码。有了这块代码,其他层就可以调用了,从service层到MVC的controller层。

 

现在我们看看是否能运行成功。

现在我先再数据库加一条记录,而我们的sql语句是根据主键来获取对象。

所以参数为1的时候能查到数据库数据,其他的时候就不能查询到数据库数据。

controller层我判断查询的对象是否为null,来分别返回不同的页面。

controller层代码是:

那么id参数为1的时候coffe对象就不为null,其他的时候就为null。

我们再观察页面就知道mybatis是否起作用了。

我们先访问: http://localhost:8080/springMvcOrm/anonymous.mvc?method=mybatisMethodTest&id=1

 

然后再访问:http://localhost:8080/springMvcOrm/anonymous.mvc?method=mybatisMethodTest&id=6

 

 

ok,没问题。说明mybatis就搭建成功了。

有什么不明白的可以留言,我有空的时候会回来回复,也欢迎大家批评指正。

see you lala。。。

以上是关于hibernate执行sql语句出现了一个很恼人的问题,控制台有时候不输出!特别的离奇!的主要内容,如果未能解决你的问题,请参考以下文章

JDBCibatis(mybatis)Hibernate有什么不同?

Hibernate 执行sql语句返回yntax error: syntax error, expect LPAREN, actual NOT not

Hibernate入门---------HQL语句

mybatis的搭建和注入spring的方式

Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句

Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句