小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

一個很方便的Hibernate自動拼裝條件工具類

 KILLKISS 2013-08-28
每做一個新的模塊都要寫一大堆組裝查詢條件的邏輯代碼,不小心有一個條件沒有用ignocase,又是一個BUG,可能你早已煩透了。

首先來看效果吧:
先看這個有六個條件的URL: 
.../findUsers.action?user.realName=lgd&user.phone=&user.age=20&user.age=30&user.organization.name=技術(shù)部&user.birthday=1980

用下面一行可以完成所有條件的封裝

Java代碼  收藏代碼
  1. //三個參數(shù)分別是:pojo類,請求參數(shù)的前輟,別名       
  2. //其中前輟是,如果URL參數(shù)寫成formBean.user.realName,那么前綴為  
  3. //formBean.user;當(dāng)URL參數(shù)寫成user.realName,那么前綴就是user  
  4. DetachedCriteria c = DetachedCriteriaUtil.createDetachedCriteria(User.class, "user", "u")  
  5. //前綴的作用是,所有以此開頭的URL參數(shù)才會被考慮用來拼裝條件  


   具體用法:下載附件JAR包并導(dǎo)入到工程中,然后在任何地方使用上面那一句即可。

   工具類做了這幾件事:
1、根據(jù)屬性類型對各種值轉(zhuǎn)型。
2、年齡條件有兩個,即20和30,因為是數(shù)值,自動使用>=和<=。
3、對于所在部門的名稱,是個關(guān)聯(lián)表字段,先創(chuàng)建別名,再拼條件。這個特點還支持無限級聯(lián),比如你可以寫一個很變態(tài)的URL參數(shù)aaa.bbb.ccc.ddd.eee.name=fff,只要你的實體確實有種關(guān)聯(lián),就可以拼裝。
4、手機字段條件沒有輸入值,不作為條件。
5、對于生日這個條件,組裝成>=19800101000000 and <=19801231235959

    上面那一行把除了分頁外的工作都做了,你已經(jīng)可以拿這個criteria去查詢了,如果你不想分頁的話。分頁邏輯可在此基礎(chǔ)上進(jìn)行封裝,不在此討論范圍內(nèi)。hibernate打出的SQL類似這樣:

   
Sql代碼  收藏代碼
  1. select ...... from sys_user user inner join sys_organization org on user.organization_id=org.id where user.real_name like ? and user.age>=? and user.age<=? and org.name like ? user.birthday>=? and user.birthday<=?  



此工具類功能包含:
1、根據(jù)請求參數(shù)自動組裝條件--組裝結(jié)果是DetachedCriteria對象。
2、部份屬性查詢--即支持只查表中部份字段,且支持無限級聯(lián)。
3、范圍值的自動拆分,如日期,如查詢條件中對日期字段只給出一個值,那么會被拆分成兩個,只有年份的,拆成當(dāng)年第0秒和當(dāng)年最后一微秒,有年月的,拆分成當(dāng)月第0秒和當(dāng)月最后一微秒,以此類推,因為你永遠(yuǎn)不可能拿僅有4位年份構(gòu)造出工一個日期來和數(shù)據(jù)庫進(jìn)行相等比較,那不會是客戶要的結(jié)果。對于數(shù)字型的字段,一個值時,進(jìn)行相等比較,兩個值時,進(jìn)行between比較,不支持多于兩值。
4、支持或條件組裝,如URL為 user.realName|user.age=35,那么SQL為user.real_name=? or user.age=?。注意這時目標(biāo)頁面無法用${user.realName|...}取回原值,可以用${realName}取值。


此工具依據(jù)功能不同有三個同名的方法,上面是第一種,只具有自動拼裝條件功能,下面是剩下兩個方法的介紹
Java代碼  收藏代碼
  1. //第二種:前三個參數(shù)同上,多加一個字符串?dāng)?shù)組,表示只需要查詢這部份屬性,是屬性名,不是字段名  
  2. criteria = DetachedCriteriaUtil.createDetachedCriteria(User.class, "user", "_user", new String[]{"id","realName"});  
  3. //SQL如下:select u.id , u.real_name from sys_user...  
  4.   
  5. //第三種:在前面的基礎(chǔ)上再加一個數(shù)組,表示不希望作為查詢條件的請求參數(shù)  
  6. //如url為../index.action?user.realName=lgd&user.password=123,  
  7. //此時如果不想要password這個查詢條件,那么這個數(shù)組定義為new String[]{"user.password"}  
  8. criteria = DetachedCriteriaUtil.createDetachedCriteria(User.class, "user", "_user", new String[]{"id","realName"},new String[]{"user.password"});  



庫依賴說明:
1、xwork.core.2.16包,struts2.18版本帶有此包,代碼里面用到它的一個OnglUtil工具將查詢結(jié)果組裝成List<Pojo>,另外RequestUtil類使用ActionContext類取得當(dāng)前請求,僅此兩處依賴xwork包。
2、hibernate3.x,這是必不可少的。


補充:
1、支持除了java.sql.Date、Map屬性外的所有常用類型屬性條件拼裝,要支持這兩種只需要依葫蘆畫瓢實現(xiàn)IValueHandler接口就行了。
2、只要改寫AliasToBean類,很容易支持Struts2.0x版本。
3、集合屬性需為泛型。
4、支持POST提交表單。
5、類圖:

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多