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

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

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

    張昊

    J-Hi(http://www.j-hi.net)

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      45 Posts :: 1 Stories :: 110 Comments :: 0 Trackbacks

           J-Hi設計自己的查詢過濾器而沒有直接采用HibernateCriteria,是出于以下兩個原因:

    1、HibernateCriteria的功能是很強大,但在使用上還是比較繁瑣。因此J-Hi想從用戶使用的簡單易用性上考慮設計一款查詢過濾器。

    2、J-Hi是一款跨ORM的多框架平臺,不能拘泥一種只在Hibernate適用的產品。因此從設計角度考慮,J-Hi對于查詢過濾功能必須要有一個中間層,從而使適應多ORM框架成為可能。

           下面讓我們來分析一下對于SQL的查詢具體應該考慮些什么

    1、                                          1、字段名            數據庫表的字段名

    2、                                          2、操作符            比如大于、小于……。還會包括一些特殊的操作符如likein

    3、                                          3、NO                 NO操作符是對操作符的補充,只有inlik也會有no

    4、                                          4、值                   對應字段類型的具體值,如字符串就要加引號,日期就要做轉換

    5、                                          5、空值               空值是特殊值,表述形式如IS NULLIS NOT NULL

    6、                                          6、關系符            兩個查詢條件之間的關系包括三種 AND OR NOT

    7、                                          7、優前級            通過左右括號來控制查詢條件的優前級

    8、                                          8、通配符            如果是like操作符,在值的左側或是右側或兩側都可以通過%來控制值的匹配條件

    對于java來說,無非就是考慮如何將上述的描述通過對象化的方式實現

    先讓我們用例說明:

           Filter filter = FilterFactory.getSimpleFilter("name", "馬超");

    首先所有的過濾器都必須由FilterFactory(過濾器工廠)創建,參數依次為

    namePOJO的屬性名的字符串,可以通過.級聯如(org.id);

    value:待過濾的過濾值

    oprtion:操作符,提供多種操作符,具體參見javadoc

    relation:關系符,兩個過濾器之間的關系,如AND / OR / NOT


    過濾器可以通過addCondition方法累加過濾條件,例如:

    filter.addCondition("name", "趙云", Filter.OPERATOR_EQ,Filter.RELATION_OR);

    調用addCondtion()方法返回是條件累加后的Filter,因此你可以一直不斷的調用addCondtion()方法,而不用每做一個過濾條件就創建一個新的Flter


    也可以通過addFilter方法將兩個過濾器連接合并在一起

           otherFilter.addFilter(filter, Filter.RELATION_AND);

    因為一個過濾器會有多個查詢條件,因此在通過addFilter()將兩上過濾器進行合并時會對這兩個過濾器自動加左右括號。對應sql為:

    (otherFilter的查詢條件) and (name like ‘%馬超%’ or name = ‘趙云’ )


           addFilter對應,J-Hi還提供了removeFilter的功能,目的是通過目標過濾器中刪除曾經加進來的子過濾器

                  otherFilter.remove(filter);

           對字符串的操作,如果不加操作符那么系統默認采用like操作符,并且左右兩側均會加通配符,為了解決通配符的問題,J-Hi提供了

    Filter likeFilter = FilterFactory.getLikeFilter("name", "馬超", Filter.RELATION_AND, LikeFilter. LIKE_CONTROLER_LEFT );

    對應的SQL語名為:name like ‘%馬超


           如果對null或非null做過濾

         FilterFactory.getSimpleFilter(propertyName, null, Filter.OPERATOR_EQ);

    FilterFactory.getSimpleFilter(propertyName, null, Filter.OPERATOR_NOT_EQ);

    對應的SQL語句分別為:propertyName IS NULL ; propertyName IS NOT NULL


    如果做包含(IN)做過濾

    FilterFactory.getInFilter(propertyName, coll);

    其中colljava.util.Collection接口的對象


    除此以外,J-Hi還提供了排序器

    Sorter sorter = SorterFactory.getSimpleSort(propertyName, Sorter.ORDER_DESC);

    Sorter.addSort(properyName1, Sorter.ORDER_ASC);

    首先所有的排序器都必須由SorterFactory(過濾器工廠)創建,排序器可以通過addSort方法累加。也可以通過addSort方法將兩個排序器連接合并在一起


    具體的調用方法例如:

    HiUserManager userMgr = (HiUserManager)SpringContextHolder.getBean(HiUser.class);

    userMger.getObjects(filter,sorter);

    總結:J-Hi的查詢過濾器并沒有象HibernateCriteria那么的強大,還不支持外連接與聚合。原因是這種大數據量的統計對ORM框架來實現在效率上并不是好的解決方案,再者實現上述功能增加了使用者操作的復雜度。薦于以上兩個原因J-Hi的查詢過濾器沒有實現上述功能。

    posted on 2011-03-13 19:23 張昊 閱讀(1629) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲AV电影天堂男人的天堂| 亚洲欧洲国产视频| 日韩在线观看视频免费| 女人张开腿给人桶免费视频| 最新亚洲卡一卡二卡三新区| 99久久99这里只有免费费精品| 亚洲成a人片7777| 大地资源二在线观看免费高清| 亚洲日韩亚洲另类激情文学| 免费高清资源黄网站在线观看| 亚洲精品精华液一区二区| 亚洲AⅤ无码一区二区三区在线| 特a级免费高清黄色片 | 亚洲一区二区三区丝袜| 在线免费观看一区二区三区| 在线播放亚洲精品| 中文字幕在线亚洲精品| 久艹视频在线免费观看| 91午夜精品亚洲一区二区三区| 黄页免费的网站勿入免费直接进入| 国产精品亚洲午夜一区二区三区| 免费毛片在线视频| 国产特黄一级一片免费| 亚洲2022国产成人精品无码区| 2021国产精品成人免费视频| 鲁啊鲁在线视频免费播放| 久久精品国产精品亚洲艾草网美妙| 精品四虎免费观看国产高清午夜| 亚洲成人免费电影| 免费大片在线观看网站| 今天免费中文字幕视频| 激情五月亚洲色图| 国产亚洲精品无码专区| 99久久99久久精品免费观看| 亚洲AV无码一区二区三区网址 | 国产成人免费A在线视频| 国产麻豆成人传媒免费观看| 国产成人精品日本亚洲网址| 亚洲国产精品不卡毛片a在线| 99在线在线视频免费视频观看| 国产偷国产偷亚洲清高APP|