论坛首页 Java企业应用论坛

DetachedCriteria实现分页查询不支持排序吗?

浏览 11648 次
精华帖 (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: 缺少右括号
   发表时间:2006-04-16  
你自己写错了

这样用
XXX.addOrder(Order.desc(YYY.PROP_ID));
0 请登录后投票
   发表时间:2006-04-16  
跟目标数据库有关 我遇到过 oracle没问题 sql server 和mysql会报错。
关键就是在查询查询总数的时候会出错 其实可以在取道count以后在设置order属性就可以了。

sorry看错了:)
 criteria.addOrder(order);;
criteria.setProjection(null);; 

上面两句换成

criteria.setProjection(null);; 
 criteria.addOrder(order);;

试试 我用了 mysql 和oracle都可以
如果是oracle的话 其实可以在DetachedCriteria后面直接加上oracle 了
0 请登录后投票
   发表时间: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 了”
这是什么意思,能给出具体代码吗?
0 请登录后投票
   发表时间:2006-04-17  
我的代码和你差不多 在分页这块才特别处理order 是因为sql server和mysql不支持在去总计数的时候有order by。

把你的sql用sql plus查查 出什么错:)
我用oracle 10g的 8。1。7的都可以 不用对order这一块特别处理
detachedCriteria..addOrder(order);
然后调用分页方法
0 请登录后投票
   发表时间:2006-04-17  
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]);;
						    }
						}
						

我的参数是一个order数组,还有criteria.setResultTransformer(Criteria.ROOT_ENTITY);可以在避免在list都是object 使用还得在转换。
这时我的mysql sql server是使用的 ,在oracle是不需要传order参数 直接在DetachedCriteria中添加的order
0 请登录后投票
   发表时间:2006-06-23  
"DetachedCriteria实现分页查询不支持排序"这个问题总算找到根源了,的确和使用的数据库有关系,我一直用的都是oracle8的最低版本,在oracle9上测试后就没有问题了,这个问题难倒了不少人,希望大家以后在没有成功的前提下首先看看用的数据库版本吧。
0 请登录后投票
   发表时间:2006-08-10  
直接在你构造的DetachedCriteria时候加order就可以了啊
DetachedCriteria detachedCriteria = DetachedCriteria
				.forClass(User.class);;
order = Order.asc(propertyName);;
detachedCriteria.addOrder(order);;



这样就按照属性排序了啊
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics