最近改一个Flash项目,用的框架是Spring+Hibernate。在操作数据库时遇到了一件头痛的事情,我要在数据库中随机的抽取5条记录,我想用hql,经查阅资料得知,sql中有随机查询的sql。
其中 sql server中是使用newid():比如 select * from table order by newid()
oracle中是用dbms_random.value:比如 select * from table order by dbms_random.value
这时我想用hibernate里面的分页功能来获取指定数量的记录,即query.setFirstResult(int).setMaxResults(int)。(我是用sessionFactory.openSession()获取连接的)
使用oracle时老是报不支持dbms_random.value。
后来解决办法是使用原生sql,即createSQLQuery(String sql)。上面报错是因为用的是createQuery(String hql)
总结:使用hql时使用session.createQuery(hql),要使用原生sql时使用session.createSQLQuery(sql)
注:以前不怎么用原生sql,主要是因为原生sql查询返回的list是没有按pojo对象装配过的Object对象,所以需要我们重新遍历list后再装配。而使用hql时,返回的list是已经装配过的对象组成的list。改进的办法是,使用原生sql时,在创建query的时候加上一句addEntity(XXX.class),即session.createSQLQuery(sql).addEntity(XXX.class)。这样处理后就不需要我们重新装配了!perfect!!!
使用oracle时的代码:
public List<Person> queryListByPage(int size) { Session session = sessionFactory.openSession(); String hql = "select * from person order by dbms_random.value"; Query query = session.createSQLQuery(hql).addEntity(Person.class); query.setFirstResult(0).setMaxResults(size); List<Person> list = query.list(); return list; }
<感谢下面的文章:http://stta04.iteye.com/blog/377633>
控制台报错:
2009-4-25 8:12:34 org.apache.catalina.core.ApplicationContext log
信息: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.miracle.dm.doc.catalog.model.DocCatalogInfo
原来的查询语句:
String sql = "select a.* from tb_doc_catalog a where a.cat_code like '"+catCode+"%'";
Session session = this.getSession();
try {
List catNameList = session.createSQLQuery(sql).list();
return catNameList ;
} finally {
releaseSession(session); //释放session
}
分析:原来是查询出来的字段并不能自动转换为bean对象。
解决思路一(采用hql查询):
String sql = "select a from DocCatalogInfo a where a.catCode like '"+catCode+"%'";
List catNameList =getHibernateTemplate().find(sql);
return catNameList ;
ok,测试一下发现没问题,看来还是因为用原生sql查询的原因,网上搜一下:createsqlQuery返回对象,看到一篇文章才觉悟到:
解决思路二(采用原生sql查询):
String sql = "select a.* from tb_doc_catalog a where a.cat_code like '"+catCode+"%'";
Session session = this.getSession();
try {
List catNameList = session.createSQLQuery(sql).addEntity(DocCatalogInfo.class).list();
return catNameList ;
} finally {
releaseSession(session); //释放session
}
又ok了。
该篇文章也贴上来: