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
- package aa;
- import static javax.persistence.GenerationType.IDENTITY;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.Id;
- import javax.persistence.Table;
- import org.hibernate.annotations.Formula;
- /**
- * 注解必须是在属性上的,如果有任何一个注解在方法上,那么@Formula将失效
- * @author 昆明蜂鸟软件
- * @version 0.1.0 2008-7-15 下午06:09:38
- */
- @Entity
- @Table(name = "user", catalog = "test")
- public class User {
- @Id
- @GeneratedValue(strategy = IDENTITY)
- private int id;
- @Formula("(select COUNT(*) from user)")
- private int count;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public int getCount() {
- return count;
- }
- public void setCount(int count) {
- this.count = count;
- }
- }
- package aa;
- import static javax.persistence.GenerationType.IDENTITY;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.Id;
- import javax.persistence.Table;
- import org.hibernate.annotations.Formula;
- /**
- * 注解必须是在属性上的,如果有任何一个注解在方法上,那么@Formula将失效
- * @author 昆明蜂鸟软件
- * @version 0.1.0 2008-7-15 下午06:09:38
- */
- @Entity
- @Table(name = "user", catalog = "test")
- public class User {
- @Id
- @GeneratedValue(strategy = IDENTITY)
- private int id;
- @Formula("(select COUNT(*) from user)")
- private int count;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public int getCount() {
- return count;
- }
- public void setCount(int count) {
- this.count = count;
- }
- }
数据库表:Sql代码
- CREATE TABLE `test`.`user` (
- `id` int(10) unsigned NOT NULL auto_increment,
- PRIMARY KEY USING BTREE (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
细节1.使用@Formula 你的注解必须是在属性上,如果有一个注解在方法上,那么@Formula将失效。这个我是做过实验的,比如把以上的java文件改为:
Java代码
- package aa;
- import static javax.persistence.GenerationType.IDENTITY;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.Id;
- import javax.persistence.Table;
- import org.hibernate.annotations.Formula;
- /**
- * 注解必须是在属性上的,如果有任何一个注解在方法上,那么@Formula将失效
- * @author 昆明蜂鸟软件
- * @version 0.1.0 2008-7-15 下午06:09:38
- */
- @Entity
- @Table(name = "user", catalog = "test")
- public class User {
- private int id;
- @Formula("(select COUNT(*) from user)")
- private int count;
- @Id
- @GeneratedValue(strategy = IDENTITY)
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public int getCount() {
- return count;
- }
- public void setCount(int count) {
- this.count = count;
- }
- }
- package aa;
- import static javax.persistence.GenerationType.IDENTITY;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.Id;
- import javax.persistence.Table;
- import org.hibernate.annotations.Formula;
- /**
- * 注解必须是在属性上的,如果有任何一个注解在方法上,那么@Formula将失效
- * @author 昆明蜂鸟软件
- * @version 0.1.0 2008-7-15 下午06:09:38
- */
- @Entity
- @Table(name = "user", catalog = "test")
- public class User {
- private int id;
- @Formula("(select COUNT(*) from user)")
- private int count;
- @Id
- @GeneratedValue(strategy = IDENTITY)
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public int getCount() {
- return count;
- }
- public void setCount(int count) {
- this.count = count;
- }
- }
这样@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。内容未经允许不得转载,或转载时需注明来源: 创新互联