<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Rory's Blog
    Happy study,Happy work,Happy life
    posts - 22,  comments - 46,  trackbacks - 0
    上篇文章:《今天發(fā)現(xiàn)一個(gè)hibernate的bug,或者說一個(gè)應(yīng)該注意的地方比較合適 》里面我提到了Hibernate查詢需要注意的一個(gè)問題。今天發(fā)現(xiàn)了一個(gè)最好的解決辦法。如果大家現(xiàn)在用Hibernate,相信大家都回用到DetachedCriteria.關(guān)于DetachedCriteria查詢請(qǐng)查看http://dev.yesky.com/241/2033241.shtml。
    ????? DetachedCriteria給我們的Hibernate查詢帶來了很多方便,但是如果你帶上排序信息就會(huì)出現(xiàn)我的上一篇文章里面說的那種錯(cuò)誤,今天發(fā)現(xiàn)一個(gè)很好的解決方法,其實(shí)也很簡(jiǎn)單。就是先把傳入的帶Order信息的DetachedCriteria去掉order信息查詢數(shù)據(jù)總條數(shù),然后再把Order加回來查詢滿足條件的對(duì)象。通過查看Hibernate的源代碼發(fā)現(xiàn)Criteria的實(shí)現(xiàn)CriteriaImpl發(fā)現(xiàn)其實(shí)addOrder是給private List orderEntries = new ArrayList();這個(gè)List加值。這個(gè)List里面放的是OrderEntry對(duì)象。這個(gè)OrderEntry里面放了一個(gè)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);
    ????}
    希望大家多多交流
    posted on 2006-05-29 23:29 莫多 閱讀(5039) 評(píng)論(12)  編輯  收藏 所屬分類: Webwork 、Spring

    FeedBack:
    # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法
    2006-06-06 21:10 | Tin
    才發(fā)現(xiàn)我們遇到了類似的問題,前幾天看你這篇Blog還沒看明白什么意思呢。今天發(fā)現(xiàn)都是同樣的問題,哈哈:D
    http://m.tkk7.com/iamtin/archive/2006/06/06/50702.html  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法
    2006-06-06 22:06 | 莫多
    是啊。都是這個(gè)問題,不過Robbin給出了最終解決方法。呵呵。
    http://www.javaeye.com/display/opensourceframework/HibernateUtils
    可以看看。  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法
    2006-11-30 11:59 | guolp
    哥們,當(dāng)我 field.set(criteria,new ArrayList());
    的時(shí)候,報(bào)錯(cuò)啊,提示不能修改private的成員
    你是怎么解決的呢  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法
    2006-11-30 12:03 | 莫多[匿名]
    field.set(criteria,new ArrayList());
    這個(gè)是在做什么?  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法
    2006-11-30 12:03 | 莫多[匿名]
    能詳細(xì)說明的么?
      回復(fù)  更多評(píng)論
      
    # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法
    2006-12-22 15:36 | 陳亮
    私有變量能這樣子取 并 做修改?????????  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法
    2006-12-22 15:41 | 莫多[匿名]
    @陳亮

    是啊。java的反射嘛。
      回復(fù)  更多評(píng)論
      
    # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法
    2006-12-28 13:16 | BeanSoft
    反射也要符合Java語(yǔ)言規(guī)范啊, 所以你這樣是行不通的.  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法
    2006-12-28 13:19 | 莫多[匿名]
    如何行不同呢?
      回復(fù)  更多評(píng)論
      
    # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法
    2008-06-20 16:41 | katelin
    field.setAccessible(true);  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法[未登錄]
    2008-09-03 11:05 | nicholas
    Criteria criteria = detachedCriteria
    .getExecutableCriteria(openSession());
    CriteriaImpl impl = (CriteriaImpl) criteria;
    //Remove order clauses where query count.
    //Order clause may cause some problem when we query count in some
    //database.
    //such as hsqldb.
    List orderEntrys = new ArrayList();
    try{
    Field field = CriteriaImpl.class.getDeclaredField("orderEntries");
    //field is private, so we must set it accessible when we access it.
    field.setAccessible(true);
    //Get orders
    orderEntrys = (List) field.get(impl);
    //Remove orders
    field.set(criteria,new ArrayList());
    }catch(Exception ex){
    ex.printStackTrace();
    }

    int totalCount = ((Integer) criteria.setProjection(
    Projections.rowCount()).uniqueResult()).intValue();
    criteria.setProjection(null);
    //add stored order clauses.
    try{
    Field field = CriteriaImpl.class.getDeclaredField("orderEntries");
    field.setAccessible(true);
    List innerOrderEntries = (List) field.get(criteria);
    innerOrderEntries.addAll(orderEntrys);
    }catch(Exception ex){
    ex.printStackTrace();
    }

    List<T> items = criteria.setFirstResult(startIndex)
    .setMaxResults(pageSize).list();  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法
    2009-07-14 10:36 | 聚資庫(kù)
    好東西!!  回復(fù)  更多評(píng)論
      

    <2009年7月>
    2829301234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    常用鏈接

    留言簿(1)

    隨筆分類(27)

    隨筆檔案(22)

    Friends

    搜索

    •  

    積分與排名

    • 積分 - 62221
    • 排名 - 845

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 无人影院手机版在线观看免费| 91亚洲精品自在在线观看| 欧美好看的免费电影在线观看| 在线观看人成视频免费无遮挡| 亚洲国产精品成人综合色在线| 亚洲日韩乱码中文无码蜜桃臀| 亚洲熟妇无码八AV在线播放| 四虎影院永久免费观看| AV大片在线无码永久免费| 久操免费在线观看| 成人免费ā片在线观看| 在线播放免费人成视频在线观看| 日本一卡精品视频免费| 国内精品99亚洲免费高清| 人人鲁免费播放视频人人香蕉| 亚洲AV色无码乱码在线观看| 亚洲一欧洲中文字幕在线| 亚洲欧洲国产成人精品| 91在线精品亚洲一区二区| 精品亚洲永久免费精品| 国产国拍精品亚洲AV片| 久久亚洲AV无码西西人体| 97在线视频免费| 国产精品免费看久久久| 可以免费观看的毛片| 99re8这里有精品热视频免费| eeuss影院ss奇兵免费com| 边摸边吃奶边做爽免费视频99| 亚洲av无码成人精品区一本二本| 亚洲一本到无码av中文字幕| 亚洲精品免费网站| 亚洲熟女精品中文字幕| 亚洲欧美日韩中文字幕在线一区| 亚洲AV无码男人的天堂| 亚洲av乱码一区二区三区按摩 | 久久久受www免费人成| www.av在线免费观看| 好猛好深好爽好硬免费视频| GOGOGO免费观看国语| 成人电影在线免费观看| 67194成手机免费观看|