新聞中心
Hibernate Formula作用很強(qiáng)大,下面我們具體來(lái)講述Hibernate Formula的應(yīng)用,希望對(duì)大家有很大的幫助。

成都創(chuàng)新互聯(lián)公司專注于成都網(wǎng)站制作、網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站開(kāi)發(fā)。公司秉持“客戶至上,用心服務(wù)”的宗旨,從客戶的利益和觀點(diǎn)出發(fā),讓客戶在網(wǎng)絡(luò)營(yíng)銷中找到自己的駐足之地。尊重和關(guān)懷每一位客戶,用嚴(yán)謹(jǐn)?shù)膽B(tài)度對(duì)待客戶,用專業(yè)的服務(wù)創(chuàng)造價(jià)值,成為客戶值得信賴的朋友,為客戶解除后顧之憂。
閱讀對(duì)象:
1.已經(jīng)在使用Hibernate JPA完成持久化映射的朋友。
2.在網(wǎng)上搜索Formula并通通搜到轉(zhuǎn)載oralce一篇技術(shù)文章或hibernate annotations技術(shù)文檔的朋友。
3.發(fā)現(xiàn)@Formula不能使用并想Ctrl+Delete hibernate jar包,然后砸爛顯示器的朋友。
本文將說(shuō)明如何使用@Formula,并且說(shuō)明在哪幾種情況下@Formula會(huì)失靈。
1.Hibernate Formula作用
引用Hibernate annotations技術(shù)文檔中的解釋可以很好的說(shuō)明@Formula的作用,但它確實(shí)沒(méi)有說(shuō)清楚怎么使用,并且給出的示例是用不了的,這讓我浪費(fèi)了好幾個(gè)鐘頭的時(shí)間!
Hibernate Formula作用就是說(shuō)白了就是用一個(gè)查詢語(yǔ)句動(dòng)態(tài)的生成一個(gè)類的屬性,比如java eye登陸之后 收件箱顯示有幾封未讀郵件的數(shù)字,就是一條select count(*)...構(gòu)成的虛擬列,而不是存儲(chǔ)在數(shù)據(jù)庫(kù)里的一個(gè)字段。用比較標(biāo)準(zhǔn)的說(shuō)法就是:有時(shí)候,你想讓數(shù)據(jù)庫(kù),而非JVM,來(lái)替你完成一些計(jì)算,也可能想創(chuàng)建某種虛擬列,你可以使用sql片段,而不是將屬性映射(物理)列。這種屬性是只讀的(屬性值由公式求得).Formula甚至可以包含sql子查詢
Formula真的這么強(qiáng)大嗎?確實(shí),它很好很強(qiáng)大,節(jié)省了不少代碼!
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;
- /**
- * 注解必須是在屬性上的,如果有任何一個(gè)注解在方法上,那么@Formula將失效
- * @author 昆明蜂鳥(niǎo)軟件
- * @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;
- /**
- * 注解必須是在屬性上的,如果有任何一個(gè)注解在方法上,那么@Formula將失效
- * @author 昆明蜂鳥(niǎo)軟件
- * @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;
- }
- }
數(shù)據(jù)庫(kù)表: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;
細(xì)節(jié)1.使用@Formula 你的注解必須是在屬性上,如果有一個(gè)注解在方法上,那么@Formula將失效。這個(gè)我是做過(guò)實(shí)驗(yàn)的,比如把以上的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;
- /**
- * 注解必須是在屬性上的,如果有任何一個(gè)注解在方法上,那么@Formula將失效
- * @author 昆明蜂鳥(niǎo)軟件
- * @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;
- /**
- * 注解必須是在屬性上的,如果有任何一個(gè)注解在方法上,那么@Formula將失效
- * @author 昆明蜂鳥(niǎo)軟件
- * @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就不可以運(yùn)行?。?!我前邊就是被Hibernate官方的文檔給搞暈了。
細(xì)節(jié)2.既然@Formula 是一個(gè)虛擬列,那么數(shù)據(jù)庫(kù)中不需要建這一列,同樣可以,如果有個(gè)列存在,hibernate也會(huì)將 其忽略。以上示例中的user就沒(méi)有count列。
細(xì)節(jié)3.sql語(yǔ)句必須寫在()中,這個(gè)以前也有人說(shuō)過(guò)。
細(xì)節(jié)4.如果有where子查詢,那么表需要用別名,比如 select COUNT(*) from user where id=1 是錯(cuò)的
而select COUNT(*) from user u where u.id=1是正確的
細(xì)節(jié)5.只要是你在數(shù)據(jù)庫(kù)的sql控制臺(tái)執(zhí)行過(guò)的語(yǔ)句,并且使用了表別名,那么@Formula都應(yīng)該是支持的。
確實(shí)@Formula是一個(gè)很常用且好用的東西!希望這篇文章能幫助你~~
本文名稱:對(duì)HibernateFormula作用的全析
文章來(lái)源:http://m.5511xx.com/article/ccogijp.html


咨詢
建站咨詢
