1,2其实虽然可以运行,但是仍有隐含的错误,不容易发现。
1。实体类和数据库的表不能映射在一起。
报错的代码:
org.hibernate.hql.ast.QuerySyntaxException: news is not mapped [select id, type,title ,author,message,date from news where type = 1 order by date desc]
org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180)
org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:111)
org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:93)
org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:327)
org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3441)
解决方法:修改sql语句
select id, type,title ,author,message,date from News where type = 1 order by date desc
数据库名和实体名,千万要注意。
2.将1中的hql语句修改之后。别以为万事大吉。其实暗藏一个问题。就是使用Interator 遍历是会出现类似这样的错误。如果不遍历只求大小的话,还好,可以正常得出结果,但是一旦遍历,始终得不出结果。仔细查看问题就出在这个hql语句上。
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.xzsz.model.News
com.xzsz.dao.impl.NewsDaoImpl.getNews(NewsDaoImpl.java:37)
com.xzsz.service.impl.NewsServiceImpl.getNews(NewsServiceImpl.java:24)
sun.reflect.GeneratedMethodAccessor42.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
解决方法,将hql语句修改为:from News where type = 1 order by date desc
另外:可以限制查询条数(10条)
Query q = this.getSession().createQuery(hql);
//限制条数
q.setFirstResult(0);
q.setMaxResults(10);
return q.list();
-------------------------------
end.