关于hibernate 中如果有top查询
Published by admin on 06月 14, 2011
在ssh的hibernate中写上这个方法
public List findTop(){
log.debug(”finding all Bulletin instances”);
try {
String queryString = “select top 10 from Bulletin order by Bulletin_Time desc”;
return getHibernateTemplate().find(queryString);
} catch (RuntimeException re) {
log.error(”find all failed”, re);
throw re;
}
}
from Bulletin order by Bulletin_Time desc直接这么写的话可以执行
但是换成上面的语句就
org.springframework.orm.hibernate3.HibernateQueryException: unexpected token: 10 near line 1, column 12 [select top 10 from com.volunteer.yy.vo.Bulletin order by Bulletin_Time desc]; nested exception is org.hibernate.hql.ast.QuerySyntaxException: unexpected token: 10 near line 1, column 12 [select top 10 from com.volunteer.yy.vo.Bulletin order by Bulletin_Time desc]
Caused by:
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: 10 near line 1, column 12 [select top 10 from com.volunteer.yy.vo.Bulletin order by Bulletin_Time desc]
首先一点,那个SQL语句不对,top 10后面要加*号,就是select top 10 * from …
或者加上你要查询的列名列表
access 没有oracle伪列,也没有vf里recno这样的函数,所以要实现分页最简单的办法就是使用top
总体思路也是从网上搜索而来,例如每页20条记录,要查找第2页的内容,就先找出前40条记录,逆序排列
然后取出其中的前20条记录即可
例如:select top 20 * from (select * from (select top 40 * from students order by id asc) as s1 order by s1.id desc) as s2 order by s2.id asc;
这只是个演示解决思路的语句
在实际操作中,因为用top 20时,hibernate的HQL解释器不能识别TOP(应该是和方言设置有关系)
所以只能用SQLQuery
Query q = session.createSQLQuery(”select top 20 * from (select * from (select top 40 s.id,s.first_name,s.age from students s order by id asc) as s1 order by s1.id desc) as s2 order by s2.id asc”);
这时问题又来了,这种方式查出来的结果是Object对象,要转为POJO对象比较麻烦
所以在list()之前加入:
q.setResultTransformer(Transformers.aliasToBean(POJO.class));
这样hibernate会根据查询结果自动生成POJO对象,并给相应的字段赋值
结果,又出现了新问题:用SQLQuery时,sql语句里要写表的字段名,不能用对象里的属性名,
用了Transformer后,它会把sql语句里的字段名当作对象的属性名调用setter方法,结果当然是找不到
这个方法了(复杂的表结构,POJO对象的属性名一般不和表的字段名一样了哦),所以还有最后一项工作,就是起别名,给查询出来的字段都起别名,起成对象里的属性名即可
Query q = session.createSQLQuery(”select top 20 * from (select * from (select top 40 s.id as id,s.first_name as firstName,s.age as age from students s order by id asc) as s1 order by s1.id desc) as s2 order by s2.id asc”);

Add A Comment