J-Hi設計自己的查詢過濾器而沒有直接采用Hibernate的Criteria,是出于以下兩個原因:
1、Hibernate的Criteria的功能是很強大,但在使用上還是比較繁瑣。因此J-Hi想從用戶使用的簡單易用性上考慮設計一款查詢過濾器。
2、J-Hi是一款跨ORM的多框架平臺,不能拘泥一種只在Hibernate適用的產品。因此從設計角度考慮,J-Hi對于查詢過濾功能必須要有一個中間層,從而使適應多ORM框架成為可能。
下面讓我們來分析一下對于SQL的查詢具體應該考慮些什么
1、
1、字段名 數據庫表的字段名
2、
2、操作符 比如大于、小于……。還會包括一些特殊的操作符如like和in
3、
3、NO NO操作符是對操作符的補充,只有in和lik也會有no
4、
4、值 對應字段類型的具體值,如字符串就要加引號,日期就要做轉換
5、
5、空值 空值是特殊值,表述形式如IS NULL或IS NOT NULL
6、
6、關系符 兩個查詢條件之間的關系包括三種 AND OR NOT
7、
7、優前級 通過左右括號來控制查詢條件的優前級
8、
8、通配符 如果是like操作符,在值的左側或是右側或兩側都可以通過%來控制值的匹配條件
對于java來說,無非就是考慮如何將上述的描述通過對象化的方式實現

先讓我們用例說明:
Filter filter = FilterFactory.getSimpleFilter("name", "馬超");
首先所有的過濾器都必須由FilterFactory(過濾器工廠)創建,參數依次為
name:POJO的屬性名的字符串,可以通過.級聯如(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);
其中coll是java.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的查詢過濾器并沒有象Hibernate的Criteria那么的強大,還不支持外連接與聚合。原因是這種大數據量的統計對ORM框架來實現在效率上并不是好的解決方案,再者實現上述功能增加了使用者操作的復雜度。薦于以上兩個原因J-Hi的查詢過濾器沒有實現上述功能。