????? DetachedCriteria給我們的Hibernate查詢帶來了很多方便,但是如果你帶上排序信息就會出現我的上一篇文章里面說的那種錯誤,今天發現一個很好的解決方法,其實也很簡單。就是先把傳入的帶Order信息的DetachedCriteria去掉order信息查詢數據總條數,然后再把Order加回來查詢滿足條件的對象。通過查看Hibernate的源代碼發現Criteria的實現CriteriaImpl發現其實addOrder是給private List orderEntries = new ArrayList();這個List加值。這個List里面放的是OrderEntry對象。這個OrderEntry里面放了一個criteria 和 order.
????
????public?PaginationSupport?findPageByCriteria(final?DetachedCriteria?detachedCriteria,?final?int?pageSize,?final?int?startIndex)?{
????????return?(PaginationSupport)?getHibernateTemplate().execute(new?HibernateCallback()?{
????????????public?Object?doInHibernate(Session?session)?throws?HibernateException?{
????????????????Criteria?criteria?=?detachedCriteria.getExecutableCriteria(session);
????????????????CriteriaImpl?impl?=?(CriteriaImpl)?criteria;
????????????????List?orderEntrys?=?new?ArrayList();
????????????????try{
????????????????????Field?field?=?CriteriaImpl.class.getDeclaredField("orderEntries");
????????????????????//Get?orders
????????????????????orderEntrys?=?(List)?field.get(impl);
????????????????????//Remove?orders
????????????????????field.set(criteria,new?ArrayList());
????????????????}catch(Exception?ex){
????????????????????ex.printStackTrace();
????????????????????//TODO?xxxx
????????????????}
????????????????int?totalCount?=?((Integer)?criteria.setProjection(Projections.rowCount())
????????????????????????.uniqueResult()).intValue();
????????????????criteria.setProjection(null);
????????????????
????????????????try{
????????????????????Field?field?=?CriteriaImpl.class.getDeclaredField("orderEntries");
????????????????????//Add?orders?return
????????????????????for(int?i=0;?i<orderEntrys.size();?i++){
????????????????????????List?innerOrderEntries?=?(List)?field.get(criteria);
????????????????????????innerOrderEntries.add(orderEntrys.get(i));
????????????????????}
????????????????}catch(Exception?ex){
????????????????????ex.printStackTrace();
????????????????????//TODO?cccc
????????????????}
????????????????List?items?=?criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();
????????????????PaginationSupport?ps?=?new?PaginationSupport(items,?totalCount,?pageSize,
????????????????????????startIndex);
????????????????return?ps;
????????????}
????????},?true);
????}
希望大家多多交流
????????return?(PaginationSupport)?getHibernateTemplate().execute(new?HibernateCallback()?{
????????????public?Object?doInHibernate(Session?session)?throws?HibernateException?{
????????????????Criteria?criteria?=?detachedCriteria.getExecutableCriteria(session);
????????????????CriteriaImpl?impl?=?(CriteriaImpl)?criteria;
????????????????List?orderEntrys?=?new?ArrayList();
????????????????try{
????????????????????Field?field?=?CriteriaImpl.class.getDeclaredField("orderEntries");
????????????????????//Get?orders
????????????????????orderEntrys?=?(List)?field.get(impl);
????????????????????//Remove?orders
????????????????????field.set(criteria,new?ArrayList());
????????????????}catch(Exception?ex){
????????????????????ex.printStackTrace();
????????????????????//TODO?xxxx
????????????????}
????????????????int?totalCount?=?((Integer)?criteria.setProjection(Projections.rowCount())
????????????????????????.uniqueResult()).intValue();
????????????????criteria.setProjection(null);
????????????????
????????????????try{
????????????????????Field?field?=?CriteriaImpl.class.getDeclaredField("orderEntries");
????????????????????//Add?orders?return
????????????????????for(int?i=0;?i<orderEntrys.size();?i++){
????????????????????????List?innerOrderEntries?=?(List)?field.get(criteria);
????????????????????????innerOrderEntries.add(orderEntrys.get(i));
????????????????????}
????????????????}catch(Exception?ex){
????????????????????ex.printStackTrace();
????????????????????//TODO?cccc
????????????????}
????????????????List?items?=?criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();
????????????????PaginationSupport?ps?=?new?PaginationSupport(items,?totalCount,?pageSize,
????????????????????????startIndex);
????????????????return?ps;
????????????}
????????},?true);
????}