站内搜索: 请输入搜索关键词

当前页面: 开发资料首页JSP 专题Hibernate变态问题,快把我搞疯了,大家救救我

Hibernate变态问题,快把我搞疯了,大家救救我

摘要: Hibernate变态问题,快把我搞疯了,大家救救我


Session s = HibernateSessionFactory.currentSession();
String hql=null;
Iterator it=null;
//第一段
hql="From BmStbi where sbeno='02200607040001'";
it = s.createQuery(hql).list().iterator();
BmStbi bs = (BmStbi)it.next();
out.print(bs.getSbeno());
out.print(bs.getSbeno());

//第二段
hql="From BmDictionary where code='0313012'";
it = s.createQuery(hql).list().iterator();
BmDictionary bd=(BmDictionary)it.next();
out.print(bd.getCode());
out.print(bd.getName());

HibernateSessionFactory.closeSession();

问题:
两段同时执行就报异常:
org.apache.jasper.JasperException: could not execute query
注释掉任何一段的话,执行正常,我实在不知道错在哪里了.


是不是需要创建两个session,楼主可以试试

hibernate机制也不是很了解


Session s = HibernateSessionFactory.currentSession();
String hql=null;
Iterator it=null;
//第一段
hql="From BmStbi where sbeno='02200607040001'";
it = s.createQuery(hql).list().iterator();
BmStbi bs = (BmStbi)it.next();
out.print(bs.getSbeno());
out.print(bs.getSbeno());

//第二段
String hql_1="From BmDictionary where code='0313012'";
Iterator it_1 = s.createQuery(hql).list().iterator();
BmDictionary bd=(BmDictionary)it_1.next();
out.print(bd.getCode());
out.print(bd.getName());

HibernateSessionFactory.closeSession();


试试


我下面还有代码的,不可能一直就这么创建和关闭吧,我也试过了,但第3次创建和关闭的时候就报错了


错误信息太少了
org.apache.jasper.JasperException: could not execute query说明不了什么问题


全部信息了
exception

org.apache.jasper.JasperException: Exception in JSP: /test/test.jsp:75

72:
73: String hql1="From BmDictionary where code='0313012'";
74:
75: Iterator it1 = s.createQuery(hql1).list().iterator();
76: BmDictionary bd=(BmDictionary)it.next();
77: out.print(bd.getCode());
78: out.print(bd.getName());


Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


root cause

org.hibernate.exception.JDBCConnectionException: could not execute query
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:66)
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
org.hibernate.loader.Loader.doList(Loader.java:1596)
org.hibernate.loader.Loader.list(Loader.java:1577)
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:395)
org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:271)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:844)
org.hibernate.impl.QueryImpl.list(QueryImpl.java:74)
org.apache.jsp.test.test_jsp._jspService(org.apache.jsp.test.test_jsp:124)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802



//第二段
String hql_1="From BmDictionary where code='0313012'";
Iterator it_1 = s.createQuery(hql).list().iterator();//hql写错了吧应该是hql_1吧
BmDictionary bd=(BmDictionary)it_1.next();
out.print(bd.getCode());
out.print(bd.getName());



我修改过了,
是在执行查询语句的时候就已经出错了,
不知道到底为什么,
快崩溃了,
能用的方法都用了


比较奇怪,查询语句都写上别名看看
From BmStbi bs where bs.sbeno='02200607040001'


在第二次查询前请先 s.clear();


还是不行,
加了别名照样报错,
而且是有了第2段,
第一段的查询就报错.


不要沉了呀,
要不我就挂了,
自己顶.


不要沉了呀,
要不我就挂了,
自己顶.


s.clear() 试过了没有?


救你啦


持久层接口加入如下方法:
public List getListByHql(String conditionHsql) {
Query query = this.getSession().createQuery(conditionHsql);
return query.list();
}
可以这样调用:
String hql=null;
Iterator it=null;
//第一段
hql="From BmStbi where sbeno='02200607040001'";
it = 接口名.getListByHql(hql).iterator();
BmStbi bs = (BmStbi)it.next();
out.print(bs.getSbeno());
out.print(bs.getSbeno());
//第二段
hql="From BmDictionary where code='0313012'";
it = 接口名.getListByHql(hql).iterator();
BmDictionary bd=(BmDictionary)it.next();
out.print(bd.getCode());
out.print(bd.getName());


Iterator it=null;it不要重复用了,第二段用it1试试



关注,学习中


关注,学习中


这样
//第一段
//...

s.close();

s = HibernateSessionFactory.currentSession();
//第二段
//...

HibernateSessionFactory.closeSession();


mark


it = s.createQuery(hql).list().iterator();
开始整整后台执行查询,但是两次查询离的太近,很有可能带来延时处理,防止延时,后面紧跟一句:s.flash();两次后面都跟上,应该就没有问题了。


不建议你经常close,session,初始化session是非常消耗系统资源的,最好是声明一个工厂类,反复使用已经声明的session,不到程序结束不要关闭会话。那个是一个数据库有一个就足够了,不够的话,修改连接池方案,然后让它产生多个session,仍然使用工厂模式向外提供引用!


还有你那个code字段是什么类型的?数值型是不能加''的,不然会报错的!


解决不了,帮助楼主up!


还没解决吗?帮你顶下!


try{} 包围起来看看跑出 什么hibernateException细细的


学习中ing


技术太多,看热闹了





在第二次查询前请先 s.clear();






同意supperman_009(天堂草)的观点。


*.hbm.xml贴出来看看


bean.xml 配置文件的字段属性是否对应错了?


Session s = HibernateSessionFactory.currentSession();
String hql=null;
Iterator it=null;
//第一段
hql="From BmStbi where sbeno='02200607040001'";
it = s.createQuery(hql).list().iterator();
BmStbi bs = (BmStbi)it.next();
out.print(bs.getSbeno());
out.print(bs.getSbeno());

//第二段
hql="From BmDictionary where code='0313012'";
it = s.createQuery(hql).list().iterator();
BmDictionary bd=(BmDictionary)it.next();
out.print(bd.getCode());
out.print(bd.getName());

HibernateSessionFactory.closeSession();

//楼主,我为你应该首先搞清HQL和sql之间的异同.
HQL是基于对象的,所以你的HQL查询语句可能有问题,
//hql="From BmStbi where sbeno='02200607040001'";
hql="from BmStbi as b where b.sbeno='02200607040001'"

//hql="From BmStbi where sbeno='02200607040001'";
hql="from BmStbi as b where b.sbeno=02200607040001'";

同时我希望楼主最好不要过多的使用链式编程,这可能不便于你的调试.


终于找到问题了,是我使用c3p0连接池的问题,本来是用的hibernate自带的连接池,换了这个就出现问题,好想连接只能使用一次,如果只一个查询的话,连着刷新会一次正确一次错误,一个页面两个查询就会出现上述错误.


↑返回目录
前一篇: 高分提问简单问题(sqlserver中怎么设置,让数据按插入的时间排序)
后一篇: 在页面中怎么打开CHM格式的帮助文件啊?