Lotus教程、Java教程、Java虚拟机、Java软件综合开发社区

Lotus、Domino、Java、C#、Web、数据库综合开发教程、资料社区

关于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”);

上一篇文章:« lotus开发技巧


【版权说明】:本网页上有部分内容来源于网上收集,但不能保证资料的完整性和准确性,仅提供参考和学习。如有侵权请立即通知我们,我们将立即删除,谢谢合作!

Add A Comment