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

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

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

    黑豆熊——BlogJava

    面對挑戰,我告訴自己:面對是勇氣,積極面對是態度,堅持積極面對是毅力!

    常用鏈接

    統計

    積分與排名

    最新評論

    Hibernate 中的Formula 攻略(轉載)

    鍵字: hibernate formula

    閱讀對象:

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

      2.在網上搜索Formula并通通搜到轉載oralce一篇技術文章或hibernate annotations技術文檔的朋友。

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

     

    文章內容

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

     

    1.Formula的作用

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

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

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

     

    2.使用Formula

     

    Java代碼 復制代碼
    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. }  

     

     

     

     數據庫表:

    Sql代碼 復制代碼
    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;  

     

     

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

    Java代碼 復制代碼
    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官方的文檔給搞暈了。

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

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

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

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

    細節5.只要是你在數據庫的sql控制臺執行過的語句,并且使用了表別名,那么@Formula都應該是支持的。

     

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

     

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

    評論

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

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

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

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

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

      回復  更多評論   


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


    網站導航:
     
    主站蜘蛛池模板: 美女黄色免费网站| 亚洲a在线视频视频| 亚洲成在人线aⅴ免费毛片| 亚洲视频在线免费看| 国产免费无码AV片在线观看不卡| 全部免费a级毛片| 免费观看亚洲人成网站| 国产免费观看网站| 日韩免费在线中文字幕| 久久这里只精品热免费99| 亚洲国产精品自在在线观看| 午夜免费福利视频| 免费少妇a级毛片人成网| 一级做a爰黑人又硬又粗免费看51社区国产精品视 | 黄色三级三级三级免费看| 免费精品国产自产拍观看| 理论片在线观看免费| 国产亚洲精品精品国产亚洲综合| 你懂的在线免费观看| 2022年亚洲午夜一区二区福利 | 日韩精品无码免费专区网站| 日韩一区二区a片免费观看| 久久亚洲精品国产亚洲老地址| 免费的涩涩视频在线播放| 相泽南亚洲一区二区在线播放| 亚洲第一成人影院| 久久免费观看国产精品88av| 亚洲精品在线免费观看| 国产免费一区二区三区免费视频| 亚洲av无码乱码国产精品fc2| 亚洲高清中文字幕免费| 久久精品国产亚洲| 国产麻豆视频免费观看| 青青久久精品国产免费看| 亚洲国产人成在线观看69网站| 成人免费一级毛片在线播放视频| 香港经典a毛片免费观看看| 亚洲AV无码一区二区二三区软件| 国产成人无码免费看视频软件| 一本大道一卡二大卡三卡免费| 亚洲精选在线观看|