对HibernateFormula作用的全析

Hibernate Formula作用很强大,下面我们具体来讲述Hibernate Formula的应用,希望对大家有很大的帮助。

成都创新互联公司专注于成都网站制作、网站建设、网页设计、网站制作、网站开发。公司秉持“客户至上,用心服务”的宗旨,从客户的利益和观点出发,让客户在网络营销中找到自己的驻足之地。尊重和关怀每一位客户,用严谨的态度对待客户,用专业的服务创造价值,成为客户值得信赖的朋友,为客户解除后顾之忧。

阅读对象:

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

  2.在网上搜索Formula并通通搜到转载oralce一篇技术文章或hibernate annotations技术文档的朋友。

  3.发现@Formula不能使用并想Ctrl+Delete hibernate jar包,然后砸烂显示器的朋友。

本文将说明如何使用@Formula,并且说明在哪几种情况下@Formula会失灵。

1.Hibernate Formula作用

引用Hibernate annotations技术文档中的解释可以很好的说明@Formula的作用,但它确实没有说清楚怎么使用,并且给出的示例是用不了的,这让我浪费了好几个钟头的时间!

Hibernate Formula作用就是说白了就是用一个查询语句动态的生成一个类的属性,比如java eye登陆之后 收件箱显示有几封未读邮件的数字,就是一条select count(*)...构成的虚拟列,而不是存储在数据库里的一个字段。用比较标准的说法就是:有时候,你想让数据库,而非JVM,来替你完成一些计算,也可能想创建某种虚拟列,你可以使用sql片段,而不是将属性映射(物理)列。这种属性是只读的(属性值由公式求得).Formula甚至可以包含sql子查询

Formula真的这么强大吗?确实,它很好很强大,节省了不少代码!

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. }

数据库表: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. }   
  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. }

这样@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是一个很常用且好用的东西!希望这篇文章能帮助你~~

文章题目:对HibernateFormula作用的全析
文章URL:http://www.gawzjz.com/qtweb2/news6/23356.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联