<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 黑豆熊 閱讀(2840) 評論(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,我們可以相互學習一下!

      回復  更多評論   


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


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 日本高清免费观看| 狠狠色伊人亚洲综合成人| 久久久久高潮毛片免费全部播放 | 国产91成人精品亚洲精品| 亚洲第一永久在线观看| 国产V亚洲V天堂A无码| 亚洲成年看片在线观看| 免费黄色网址入口| 免费做爰猛烈吃奶摸视频在线观看 | 四虎必出精品亚洲高清| 亚洲日本在线观看| 亚洲精品无码高潮喷水在线| 免费午夜爽爽爽WWW视频十八禁| 最近中文字幕无免费视频| 最近中文字幕免费mv在线视频| 精品多毛少妇人妻AV免费久久| 国产综合激情在线亚洲第一页 | 又粗又大又黑又长的免费视频| 久久久久国产精品免费看| 免费在线观看一级片| 曰批全过程免费视频播放网站| 亚洲日韩v无码中文字幕| 国产一区二区三区免费视频| 搡女人免费视频大全| 国产91免费视频| 亚洲视频在线免费观看| 免费一区二区三区| 四虎影视成人永久免费观看视频| 你懂得的在线观看免费视频| 手机看片国产免费永久| a级毛片毛片免费观看久潮喷| 精品多毛少妇人妻AV免费久久 | 亚洲精品无码你懂的网站| 亚洲av日韩片在线观看| 亚洲AV中文无码乱人伦在线视色| 国产一区二区免费在线| 夜色阁亚洲一区二区三区| 亚洲国产精品成人| 亚洲永久无码3D动漫一区| 亚洲色偷偷偷鲁综合| 亚洲短视频男人的影院|