自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

對Hibernate Formula作用的全析

開發(fā) 后端
Hibernate Formula作用就是說白了就是用一個查詢語句動態(tài)的生成一個類的屬性,比如java eye登陸之后 收件箱顯示有幾封未讀郵件的數(shù)字,就是一條select count(*)...構成的虛擬列,而不是存儲在數(shù)據(jù)庫里的一個字段。

Hibernate Formula作用很強大,下面我們具體來講述Hibernate Formula的應用,希望對大家有很大的幫助。

閱讀對象:

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

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

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

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

1.Hibernate Formula作用

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

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

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

2.使用Formula

  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. }     
  44. package aa;  
  45. import static javax.persistence.GenerationType.IDENTITY;  
  46. import javax.persistence.Entity;  
  47. import javax.persistence.GeneratedValue;  
  48. import javax.persistence.Id;  
  49. import javax.persistence.Table;  
  50. import org.hibernate.annotations.Formula;  
  51. /**  
  52. * 注解必須是在屬性上的,如果有任何一個注解在方法上,那么@Formula將失效  
  53. * @author 昆明蜂鳥軟件  
  54. * @version 0.1.0 2008-7-15 下午06:09:38  
  55. */  
  56. @Entity  
  57. @Table(name = "user"catalog = "test")  
  58. public class User {  
  59. @Id  
  60. @GeneratedValue(strategy = IDENTITY)  
  61. private int id;  
  62. @Formula("(select COUNT(*) from user)")  
  63. private int count;  
  64. public int getId() {  
  65. return id;  
  66. }  
  67. public void setId(int id) {  
  68. this.id = id;  
  69. }  
  70. public int getCount() {  
  71. return count;  
  72. }  
  73. public void setCount(int count) {  
  74. this.count = count;  
  75. }  
  76. }  
  77.  

數(shù)據(jù)庫表: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;  

細節(jié)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. }     
  44. package aa;  
  45. import static javax.persistence.GenerationType.IDENTITY;  
  46. import javax.persistence.Entity;  
  47. import javax.persistence.GeneratedValue;  
  48. import javax.persistence.Id;  
  49. import javax.persistence.Table;  
  50. import org.hibernate.annotations.Formula;  
  51. /**  
  52. * 注解必須是在屬性上的,如果有任何一個注解在方法上,那么@Formula將失效  
  53. * @author 昆明蜂鳥軟件  
  54. * @version 0.1.0 2008-7-15 下午06:09:38  
  55. */  
  56. @Entity  
  57. @Table(name = "user"catalog = "test")  
  58. public class User {  
  59. private int id;  
  60. @Formula("(select COUNT(*) from user)")  
  61. private int count;  
  62. @Id  
  63. @GeneratedValue(strategy = IDENTITY)  
  64. public int getId() {  
  65. return id;  
  66. }  
  67. public void setId(int id) {  
  68. this.id = id;  
  69. }  
  70. public int getCount() {  
  71. return count;  
  72. }  
  73. public void setCount(int count) {  
  74. this.count = count;  
  75. }  
  76. }  
  77.  

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

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

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

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

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

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

 

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

【編輯推薦】

  1. Hibernate入門學習寶典
  2. Hibernate屬性簡單分析
  3. Struts-Spring-Hibernate案例
  4. Hibernate Sessin接口常用方法
  5. Hibernate事務全面介紹
責任編輯:仲衡 來源: blogjava
相關推薦

2009-09-24 09:18:18

2010-02-22 11:02:55

Python功能

2010-03-01 13:19:21

Python線程內容

2009-09-23 17:36:26

Hibernate優(yōu)點

2010-09-16 12:02:44

vpdn pppoe配

2010-09-29 14:04:25

RHCE DHCP配置

2009-06-12 15:05:03

cascadeHibernate

2010-07-21 16:08:57

telnet命令

2009-09-23 14:40:17

Hibernate F

2010-09-06 09:18:08

PPP Options

2009-06-18 14:51:12

Hibernate緩存Hibernate

2009-06-16 14:36:54

Hibernate繼承

2009-09-22 13:25:54

Hibernate M

2009-09-23 14:05:08

Hibernate接口

2009-09-22 13:35:04

Hibernate A

2010-02-04 13:43:20

Android操作系統(tǒng)

2009-09-22 09:55:58

Hibernate實例

2009-06-04 10:34:19

Hibernate一對一對多關系配置

2014-03-25 10:57:42

Android消息推送方案

2009-06-18 14:22:06

Hibernate多對Hibernate
點贊
收藏

51CTO技術棧公眾號