1、在用Hibernate写增删改查时,有两种方式:a、HQL语句,b、原生态sql语句
如果我要执行的语句是:select * from Question
HQL是这么写的:
Session session = getSession();
String hql="from Question";
List list = (Question)session.createQuery(hql).list();
System.out.println(list.getTitle());
测试正常
SQL写法:
Session session=getSession();
String sql="select * from Question"
List list=(Question)session.createSQLQuery(sql).list();// 会发生类型转换错误,就是文章开头的那个错误
原因:
HQL中
String hql="from Question";
List list = (Question)session.createQuery(hql).list();
会根据你的hql语句,自动将session.createQuery(hql).list()的返回对象以hibernate生成的Bean为对象装入list返回
SQL中
String sql="select * from Question"
List list=(Question)session.createSQLQuery(sql).list();
则是以对象数组进行存储返回
一句话:HQL:返回list装的是Bean SQL:返回对象就是一数组,数组在转为Question对象时,当然会报错。
解决方法:
第一种:直接老老实实用HQL去写吧= =参数化就百度“Hibernate 参数绑定”就行
第二种:使用原生SQL,调用其中的一个方法addEntity()
String sql="select * from Question";
Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);
List list = (Question)query;
这样 list中也就装的是Question这洋一个个Bean对象了,问题还是不知道如何参数化= =!
找到方法了:
Hibernate中的分页语句可以这么写
session = HibernateUtils.getSession();
session.beginTransaction();
Query query = session.createQuery("from User");
query.setFirstResult(0);//从第一条记录开始
query.setMaxResults(4);//取出四条记录
List userList = query.list();
2、a different object with the same identifier value was already associated with the session。
错误原因:在hibernate中同一个session里面有了两个相同标识但是是不同实体。
解决方法一:session.clean()
PS:如果在clean操作后面又进行了saveOrUpdate(object)等改变数据状态的操作,有可能会报出"Found two representations of same collection"异常。
解决方法二:session.refresh(object)
PS:当object不是数据库中已有数据的对象的时候,不能使用session.refresh(object)因为该方法是从hibernate的 session中去重新取object,如果session中没有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判 断一下。
解决方法三:session.merge(object)
PS:Hibernate里面自带的方法,推荐使用。
3、Found two representations of same collection
错误原因:见1。
解决方法:session.merge(object)
2、3、两中异常经常出现在一对多映射和多对多映射中