黑豆熊——BlogJava

          面對挑戰(zhàn),我告訴自己:面對是勇氣,積極面對是態(tài)度,堅持積極面對是毅力!

          常用鏈接

          統(tǒng)計

          積分與排名

          最新評論

          Hibernate 中的Formula 攻略(轉(zhuǎn)載)

          鍵字: hibernate formula

          閱讀對象:

            1.已經(jīng)在使用Hibernate JPA完成持久化映射的朋友。

            2.在網(wǎng)上搜索Formula并通通搜到轉(zhuǎn)載oralce一篇技術(shù)文章或hibernate annotations技術(shù)文檔的朋友。

            3.發(fā)現(xiàn)@Formula不能使用并想Ctrl+Delete hibernate jar包,然后砸爛顯示器的朋友。

           

          文章內(nèi)容

            本文將說明如何使用@Formula,并且說明在哪幾種情況下@Formula會失靈。

           

          1.Formula的作用

            引用hibernate annotations技術(shù)文檔中的解釋可以很好的說明@Formula的作用,但它確實沒有說清楚怎么使用,并且給出的示例是用不了的,這讓我浪費了好幾個鐘頭的時間!

             Formula的作用就是說白了就是用一個查詢語句動態(tài)的生成一個類的屬性,比如java eye登陸之后 收件箱顯示有幾封未讀郵件的數(shù)字,就是一條select count(*)...構(gòu)成的虛擬列,而不是存儲在數(shù)據(jù)庫里的一個字段。用比較標(biāo)準(zhǔn)的說法就是:有時候,你想讓數(shù)據(jù)庫,而非JVM,來替你完成一些計算,也可能想創(chuàng)建某種虛擬列,你可以使用sql片段,而不是將屬性映射(物理)列。這種屬性是只讀的(屬性值由公式求得).Formula甚至可以包含sql子查詢

             Formula真的這么強大嗎?確實,它很好很強大,節(jié)省了不少代碼!

           

          2.使用Formula

           

          Java代碼 復(fù)制代碼
          1. package aa;   
          2.   
          3. import static javax.persistence.GenerationType.IDENTITY;   
          4.   
          5. import javax.persistence.Entity;   
          6. import javax.persistence.GeneratedValue;   
          7. import javax.persistence.Id;   
          8. import javax.persistence.Table;   
          9.   
          10. import org.hibernate.annotations.Formula;   
          11.   
          12. /**  
          13.  * 注解必須是在屬性上的,如果有任何一個注解在方法上,那么@Formula將失效  
          14.  * @author 昆明蜂鳥軟件  
          15.  * @version 0.1.0 2008-7-15 下午06:09:38  
          16.  */  
          17. @Entity  
          18. @Table(name = "user", catalog = "test")   
          19. public class User {   
          20.        
          21.     @Id  
          22.     @GeneratedValue(strategy = IDENTITY)   
          23.     private int id;   
          24.   
          25.     @Formula("(select COUNT(*) from user)")   
          26.     private int count;   
          27.   
          28.     public int getId() {   
          29.         return id;   
          30.     }   
          31.   
          32.     public void setId(int id) {   
          33.         this.id = id;   
          34.     }   
          35.   
          36.     public int getCount() {   
          37.         return count;   
          38.     }   
          39.   
          40.     public void setCount(int count) {   
          41.         this.count = count;   
          42.     }   
          43. }  

           

           

           

           數(shù)據(jù)庫表:

          Sql代碼 復(fù)制代碼
          1. CREATE TABLE  `test`.`user` (   
          2.   `id` int(10) unsigned NOT NULL auto_increment,   
          3.   PRIMARY KEY  USING BTREE (`id`)   
          4. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;  

           

           

          細(xì)節(jié)1.使用@Formula 你的注解必須是在屬性上,如果有一個注解在方法上,那么@Formula將失效。這個我是做過實驗的,比如把以上的java文件改為:

          Java代碼 復(fù)制代碼
          1. package aa;   
          2.   
          3. import static javax.persistence.GenerationType.IDENTITY;   
          4.   
          5. import javax.persistence.Entity;   
          6. import javax.persistence.GeneratedValue;   
          7. import javax.persistence.Id;   
          8. import javax.persistence.Table;   
          9.   
          10. import org.hibernate.annotations.Formula;   
          11.   
          12. /**  
          13.  * 注解必須是在屬性上的,如果有任何一個注解在方法上,那么@Formula將失效  
          14.  * @author 昆明蜂鳥軟件  
          15.  * @version 0.1.0 2008-7-15 下午06:09:38  
          16.  */  
          17. @Entity  
          18. @Table(name = "user", catalog = "test")   
          19. public class User {   
          20.        
          21.     private int id;   
          22.   
          23.     @Formula("(select COUNT(*) from user)")   
          24.     private int count;   
          25.        
          26.     @Id  
          27.     @GeneratedValue(strategy = IDENTITY)   
          28.     public int getId() {   
          29.         return id;   
          30.     }   
          31.   
          32.     public void setId(int id) {   
          33.         this.id = id;   
          34.     }   
          35.   
          36.     public int getCount() {   
          37.         return count;   
          38.     }   
          39.   
          40.     public void setCount(int count) {   
          41.         this.count = count;   
          42.     }   
          43. }  

           

           這樣@Formula就不可以運行!!!我前邊就是被Hibernate官方的文檔給搞暈了。

          細(xì)節(jié)2.既然@Formula 是一個虛擬列,那么數(shù)據(jù)庫中不需要建這一列,同樣可以,如果有個列存在,hibernate也會將   其忽略。以上示例中的user就沒有count列。

          細(xì)節(jié)3.sql語句必須寫在()中,這個以前也有人說過。

          細(xì)節(jié)4.如果有where子查詢,那么表需要用別名,比如 select COUNT(*) from user where id=1 是錯的

          而select COUNT(*) from user u where u.id=1是正確的

          細(xì)節(jié)5.只要是你在數(shù)據(jù)庫的sql控制臺執(zhí)行過的語句,并且使用了表別名,那么@Formula都應(yīng)該是支持的。

           

           確實@Formula是一個很常用且好用的東西!希望這篇文章能幫助你~~

           

          posted on 2008-11-26 11:07 黑豆熊 閱讀(2844) 評論(2)  編輯  收藏

          評論

          # re: Hibernate 中的Formula 攻略(轉(zhuǎn)載) 2008-12-19 11:12 兔子

          兄弟如果這個 @Formula 查得是另外一個表中的 記錄數(shù) 并且從該表還傳一個參數(shù)過去 怎么弄了?

          select id ,
          name
          (selcct count(*) from B where b.id=a.id b.xx=...)
          from A
          where a.xx=......
          這們的SQL該如何寫了?
          我的QQ:231873111 一起討論下  回復(fù)  更多評論   

          # re: Hibernate 中的Formula 攻略(轉(zhuǎn)載)[未登錄] 2008-12-22 10:12 黑色幽靈

          @兔子
          其實,我也不咋地,不知道這位仁兄是否用MSN如果用MSN,如果不嫌棄的話,可以加我:zhang_jian_java@hotmail.com,我們可以相互學(xué)習(xí)一下!

            回復(fù)  更多評論   


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 凤山市| 清丰县| 嘉祥县| 新河县| 东港市| 博野县| 梁山县| 静宁县| 景谷| 扎赉特旗| 红安县| 万全县| 彭水| 清水县| 兰州市| 兴仁县| 沙洋县| 舟山市| 闻喜县| 云林县| 永德县| 南澳县| 云霄县| 西盟| 龙里县| 大石桥市| 呼图壁县| 杂多县| 汉中市| 宝应县| 四川省| 台中市| 南乐县| 会泽县| 屏东市| 瑞金市| 明溪县| 湘乡市| 十堰市| 衡山县| 新乡县|