<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++博客   博問  
     
    主站蜘蛛池模板: 久久久综合亚洲色一区二区三区| 日本一道综合久久aⅴ免费| 亚洲毛片网址在线观看中文字幕| 欧美亚洲国产SUV| 免费jjzz在在线播放国产| 老外毛片免费视频播放| 亚洲日韩人妻第一页| 中文字幕在线观看免费| 亚洲av永久无码制服河南实里| 国产好大好硬好爽免费不卡| 99久久精品国产亚洲| 免费99精品国产自在现线| 亚洲欧美国产欧美色欲| 亚洲国产精品成人久久蜜臀| 本免费AV无码专区一区| 久久亚洲精精品中文字幕| 免费大片黄在线观看yw| 国产精品亚洲一区二区无码| 久久久无码精品亚洲日韩软件 | 亚洲欧美日韩中文二区| 全部免费毛片免费播放| 中文字字幕在线高清免费电影| 亚洲国产女人aaa毛片在线| 亚洲免费电影网站| 亚洲精华液一二三产区| 国产亚洲精品AA片在线观看不加载 | a级亚洲片精品久久久久久久| 免费无码又爽又刺激网站| 亚洲综合免费视频| 日本人护士免费xxxx视频| 免费毛片在线看不用播放器| 亚洲制服丝袜一区二区三区| 国产成人精品免费视频软件| 99在线热播精品免费99热| 亚洲福利电影在线观看| 人人狠狠综合久久亚洲高清| 国产成人精品免费久久久久| 亚洲成a人片在线观看精品| 亚洲狠狠爱综合影院婷婷| 99久热只有精品视频免费看| 国产亚洲一卡2卡3卡4卡新区|