`
solonote
  • 浏览: 89968 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Hibernate @Formula 攻略

阅读更多

阅读对象:

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

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

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

 

文章内容

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

 

1.Formula的作用

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

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

 

 

 

 数据库表:

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文件改为:

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

 声明:允许转载且不著名文章作者,但不允许修改文章后转载。

 

评论
6 楼 zeng1990 2011-09-21  
我也试过了,@Formula注解写在方法上也是可以的,不过有一点是@Formula这个注解不能和javax.persistence.Transient这个注解一起用,一起用的话@Formula注解就会失效。这一点害惨我鸟。
5 楼 灵灵然 2009-03-18  
注意统一就可以,要么全部写在属性上,要么全部写在方法上
4 楼 lym6520 2009-02-03  
lym6520 写道

,你说 注解必须是在属性上的,如果有任何一个注解在方法上,那么@Formula将失效 ,我测试过了,注解在方法上也是没问题的,我用的hibernate版本是3.2的,,

补充下,在这样的情况下,必须也要有set方法。
3 楼 lym6520 2009-02-03  
,你说 注解必须是在属性上的,如果有任何一个注解在方法上,那么@Formula将失效 ,我测试过了,注解在方法上也是没问题的,我用的hibernate版本是3.2的,,
2 楼 lym6520 2009-02-03  
整理的好,不过@Formula("(hql)")中要注意的是,hql中的对象(也就是表名)必须是数据库中的表名,
1 楼 kevinhrw 2009-01-13  
学习了~谢谢

相关推荐

    @Formula的作用和使用

    在Java实体类中使用`@Formula`注解,通常会结合JPA或Hibernate等ORM框架。下面通过一个具体的例子来说明如何使用`@Formula`: ```java @Entity public class News { private int id; private String title; ...

    @hibernate Tag Reference

    - **formula**: 在复杂情况下指定SQL公式来确定子类。 **示例代码**: ```java @hibernate.discriminator(column="type") public abstract class Animal { // ... } ``` ##### 1.4 @hibernate.jcs-cache (0..1) ...

    hibernate中文帮助文档

    2.4. Hibernate独有的注解扩展:除了标准的EJB3注解,Hibernate还提供了一些自定义注解,如`@GeneratedValue`用于设置主键生成策略,`@Formula`用于在属性中使用SQL表达式,`@Cache`用于配置缓存,`@Filter`用于动态...

    hibernate_annotation_中文帮助文档

    - `@Entity`、`@Id`、`@Column`等是标准的JPA注解,而`@Formula`、`@Cacheable`、`@Filter`等是Hibernate特有的,提供更丰富的功能,如计算属性、缓存策略和动态过滤。 5. **通过XML覆写元数据** 虽然注解是首选...

    habernate文档

    Hibernate是一个开源的对象关系映射(ORM)框架,它提供了Java应用程序和关系数据库之间的桥梁。通过Hibernate,开发者能够使用面向对象的方式来操作数据库,而无需过多关注底层数据库的具体细节。HibernateSearch是...

    hibernate annotations 中文参考手册

    ##### @Formula 用于执行数据库查询表达式。例如,如果需要计算两个字段的总和并将其存储在一个虚拟字段中,可以使用此注解。 ##### @Embedded 和 @Embeddable 这两个注解用于实现值对象的嵌入式映射: - `@...

    hibernate_annotations.pdf

    - **@Formula**:用于根据表中的其他字段计算出一个新字段的值。 - **@Version**:用于实现乐观锁。 - **@Transient**:用于指定某个字段不被持久化。 #### 七、注解配置与实体类映射关系 在Hibernate注解式开发中...

    hibernate教程

    - 公式:`@Formula`。 - 类型:`@Type`。 - 索引:`@Index`。 - `@Parent`:用于关联关系。 - 生成的属性:`@Generated`。 - **继承**:通过`@Inheritance`来配置不同的继承策略。 - **关联关系**: - 延迟...

    hibernate-annotations-3.4.0(参考文档,doc/../index.html)

    2. `@Formula`: 使用SQL表达式来获取字段值,提供更灵活的数据获取方式。 3. `@Embeddable` 和 `@Embedded`: 支持复合类型,将多个属性封装到一个类中,作为一个整体进行持久化。 4. `@SecondaryTable`: 将实体映射...

    hibernate annotation 中文文档

    - **2.4.3.2 公式**:`@Formula` 注解用于计算属性,其值是基于 SQL 表达式动态计算得出的。 - **2.4.3.3 类型**:`@Type` 注解用来定义属性的类型转换策略。 - **2.4.3.4 索引**:`@Index` 注解用于在属性上创建...

    hibernate_anoatation(中文版)

    ### Hibernate注解(Annoatation)中文版详解 #### 版本:3.2.0CR1 在Java开发领域中,Hibernate作为一款流行的开源对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者用面向对象的方式来处理数据库...

    hibernate4注解详尽参考

    5. 高级映射注解:例如@Formula注解允许开发者插入数据库特定的SQL表达式,@SecondaryTable注解用于映射实体到多个表。 6. 缓存注解:@Cacheable注解可以指定实体或集合是可缓存的,以及使用的缓存策略。 7. 其他...

    hibernate_annotations(中文API,高清)

    例如,可以通过指定@Formula来使用原生SQL查询来覆盖某些特定的计算字段,或者使用@NotFound(action=NotFoundAction.IGNORE)来优化外键关联的性能问题。 9. **元数据提取**:Hibernate可以自动从注解中提取元数据,...

    hibernate 中文注解

    - **公式:** `@Formula`注解用于定义基于其他属性计算得出的属性。 - **类型:** `@Type`注解用于指定自定义的数据类型转换器。 - **索引:** `@Index`注解用于定义索引。 - **@Parent:** 用于关联映射。 - *...

    hibernate注解

    3. **@Formula:** 可以使用 SQL 表达式定义只读属性。 4. **@Cacheable:** 指示该实体可以被缓存。 5. **@Version:** 用于乐观锁定。 6. **@Cascade:** 控制级联操作。 7. **@Filter:** 定义动态过滤器。 ...

    Hibernate+中文文档

    5.1.20. 字段和规则元素(column and formula elements) 5.1.21. 引用(import) 5.1.22. any 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次...

    hibernate annotation帮助文档

    - **公式**:使用 `@Formula` 注解来定义基于 SQL 表达式的计算属性。 - **类型**:使用 `@Type` 注解来指定自定义类型转换器。 - **索引**:使用 `@Index` 注解来指定索引。 - **@Parent**:用于表示实体之间的...

Global site tag (gtag.js) - Google Analytics