浏览 3908 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2006-04-13
尝试了本论坛中robbin写的一篇关于“应用Hibernate3的DetachedCriteria实现分页查询”的文章,感觉很不错,可是加入排序后,就出现问题了,难道应用Hibernate3的DetachedCriteria实现分页查询不支持排序吗?
看了Hibernate3.0.5中带的单元测试代码,DetachedCriteria是支持排序的,这是咋回事呢,不知哪位用过DetachedCriteria的排序吗? 下面是我在DetachedCriteria实现分页中加入的一段排序代码,大家给看看什么地方有问题: public PaginationSupport findPageByCriteria( final DetachedCriteria detachedCriteria, final Order order, final int pageSize, final int startIndex) { return (PaginationSupport) getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Criteria criteria = detachedCriteria.getExecutableCriteria(session); int totalCount = ((Integer) criteria.setProjection( Projections.rowCount()).uniqueResult()) .intValue(); criteria.addOrder(order); criteria.setProjection(null); List items = criteria.setFirstResult(startIndex) .setMaxResults(pageSize).list(); PaginationSupport ps = new PaginationSupport(items, totalCount, pageSize, startIndex); return ps; } }, true); } 上面代码中若去掉:criteria.addOrder(order);这行,可以查询出分页信息,但加入这个排序后就出错了。 下面是执行后报的错误: Hibernate: select count(*) as y0_ from users this_ Hibernate: select * from ( select row_.*, rownum rownum_ from ( select this_.id as id0_, this_.username as username0_0_, this_.password as password0_0_, this_.age as age0_0_, this_.sex as sex0_0_ from users this_ order by this_.id asc ) row_ ) where rownum_ <= ? and rownum_ > ? - SQL Error: 907, SQLState: 42000 - ORA-00907: 缺少右括号 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2006-04-16
你自己写错了
这样用 XXX.addOrder(Order.desc(YYY.PROP_ID)); |
|
| 返回顶楼 | |
|
时间:2006-04-16
跟目标数据库有关 我遇到过 oracle没问题 sql server 和mysql会报错。
关键就是在查询查询总数的时候会出错 其实可以在取道count以后在设置order属性就可以了。 sorry看错了:) [code:1] criteria.addOrder(order); criteria.setProjection(null); [/code:1] 上面两句换成 [code:1] criteria.setProjection(null); criteria.addOrder(order);[/code:1] 试试 我用了 mysql 和oracle都可以 如果是oracle的话 其实可以在DetachedCriteria后面直接加上oracle 了 |
|
| 返回顶楼 | |
|
时间:2006-04-17
To:xmvigour
按照你说的: java代码: criteria.setProjection(null); criteria.addOrder(order); 试了,下面是修改后的代码: Criteria criteria = detachedCriteria .getExecutableCriteria(session); int totalCount = ((Integer) criteria.setProjection( Projections.rowCount()).uniqueResult()) .intValue(); criteria.setProjection(null); criteria.addOrder(order); List items = criteria.setFirstResult(startIndex) .setMaxResults(pageSize).list(); PaginationSupport ps = new PaginationSupport(items, totalCount, pageSize, startIndex); return ps; 测试后还是不可以的,我用到的是oracle8.0,驱动是jdbc14.jar,请问你用oracle是可以的吗,把你的代码贴出来看看吧,谢谢了。 还有你说的: “如果是oracle的话 其实可以在DetachedCriteria后面直接加上oracle 了” 这是什么意思,能给出具体代码吗? |
|
| 返回顶楼 | |
|
时间:2006-04-17
我的代码和你差不多 在分页这块才特别处理order 是因为sql server和mysql不支持在去总计数的时候有order by。
把你的sql用sql plus查查 出什么错:) 我用oracle 10g的 8。1。7的都可以 不用对order这一块特别处理 detachedCriteria..addOrder(order); 然后调用分页方法 |
|
| 返回顶楼 | |
|
时间:2006-04-17
[code:1]criteria.setProjection(null);
criteria.setResultTransformer(Criteria.ROOT_ENTITY); if(orders!=null&&orders.length>0){ for(int i=0;i<orders.length;i++){ criteria.addOrder(orders[i]); } } [/code:1] 我的参数是一个order数组,还有criteria.setResultTransformer(Criteria.ROOT_ENTITY);可以在避免在list都是object 使用还得在转换。 这时我的mysql sql server是使用的 ,在oracle是不需要传order参数 直接在DetachedCriteria中添加的order |
|
| 返回顶楼 | |
|
时间:2006-06-23
"DetachedCriteria实现分页查询不支持排序"这个问题总算找到根源了,的确和使用的数据库有关系,我一直用的都是oracle8的最低版本,在oracle9上测试后就没有问题了,这个问题难倒了不少人,希望大家以后在没有成功的前提下首先看看用的数据库版本吧。
|
|
| 返回顶楼 | |
|
时间:2006-08-10
直接在你构造的DetachedCriteria时候加order就可以了啊
[code:1] DetachedCriteria detachedCriteria = DetachedCriteria .forClass(User.class); order = Order.asc(propertyName); detachedCriteria.addOrder(order); [/code:1] 这样就按照属性排序了啊 |
|
| 返回顶楼 | |




