这篇文章是关于Hibernate Formula是做什么的。我觉得边肖很实用,就和大家分享一下作为参考。让我们跟着边肖看一看。
1.1的函数。冬眠公式
引用Hibernate annotations技术文档中的解释可以很好的解释@Formula的功能,但是真的没有说清楚怎么用,给出的例子也没用,让我浪费了好几个小时!
Hibernate Formula的功能是使用查询语句动态生成类的属性。例如,java eye登录后,收件箱中显示的未读电子邮件数量是一个由select count(*)组成的虚拟列.而不是存储在数据库中的字段。用标准术语来说,有时,您希望数据库而不是JVM为您做一些计算,或者您可能希望创建某种虚拟列。您可以使用sql片段,而不是将属性映射到(物理)列。该属性是只读的(属性值由公式决定)。公式甚至可以包含sql子查询
配方真的这么厉害吗?的确,它非常好,功能强大,节省了大量代码!
使用公式
packageaaimportstaticjavax . persistence . generationtype . IDENTITY;import javax . persistence . entity;import javax . persistence . generated value;import javax . persistence . id;import javax . persistence . table;import org . hibernate . annotations . formula;/* * *注释必须是属性。如果方法上有注释,@Formula将无效* @作者昆明蜂鸟软件*@version0.1.02008-7-15,06:09:38 */@ entity @ table(name=' user ',catalog=' test ')public class user { @ Id @ generated value(strategy=IDENTITY)privated;@ Formula('(select count(*)from user)')privateintcount;公共图书馆
ic 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都应该是支持的。
感谢各位的阅读!关于“Hibernate Formula有什么作用”这篇文章就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/137018.html