阅读对象:
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是一个很常用且好用的东西!希望这篇文章能帮助你~~
声明:允许转载且不著名文章作者,但不允许修改文章后转载。
分享到:
相关推荐
在Java实体类中使用`@Formula`注解,通常会结合JPA或Hibernate等ORM框架。下面通过一个具体的例子来说明如何使用`@Formula`: ```java @Entity public class News { private int id; private String title; ...
- **formula**: 在复杂情况下指定SQL公式来确定子类。 **示例代码**: ```java @hibernate.discriminator(column="type") public abstract class Animal { // ... } ``` ##### 1.4 @hibernate.jcs-cache (0..1) ...
2.4. Hibernate独有的注解扩展:除了标准的EJB3注解,Hibernate还提供了一些自定义注解,如`@GeneratedValue`用于设置主键生成策略,`@Formula`用于在属性中使用SQL表达式,`@Cache`用于配置缓存,`@Filter`用于动态...
- `@Entity`、`@Id`、`@Column`等是标准的JPA注解,而`@Formula`、`@Cacheable`、`@Filter`等是Hibernate特有的,提供更丰富的功能,如计算属性、缓存策略和动态过滤。 5. **通过XML覆写元数据** 虽然注解是首选...
Hibernate是一个开源的对象关系映射(ORM)框架,它提供了Java应用程序和关系数据库之间的桥梁。通过Hibernate,开发者能够使用面向对象的方式来操作数据库,而无需过多关注底层数据库的具体细节。HibernateSearch是...
##### @Formula 用于执行数据库查询表达式。例如,如果需要计算两个字段的总和并将其存储在一个虚拟字段中,可以使用此注解。 ##### @Embedded 和 @Embeddable 这两个注解用于实现值对象的嵌入式映射: - `@...
- **@Formula**:用于根据表中的其他字段计算出一个新字段的值。 - **@Version**:用于实现乐观锁。 - **@Transient**:用于指定某个字段不被持久化。 #### 七、注解配置与实体类映射关系 在Hibernate注解式开发中...
- 公式:`@Formula`。 - 类型:`@Type`。 - 索引:`@Index`。 - `@Parent`:用于关联关系。 - 生成的属性:`@Generated`。 - **继承**:通过`@Inheritance`来配置不同的继承策略。 - **关联关系**: - 延迟...
2. `@Formula`: 使用SQL表达式来获取字段值,提供更灵活的数据获取方式。 3. `@Embeddable` 和 `@Embedded`: 支持复合类型,将多个属性封装到一个类中,作为一个整体进行持久化。 4. `@SecondaryTable`: 将实体映射...
- **2.4.3.2 公式**:`@Formula` 注解用于计算属性,其值是基于 SQL 表达式动态计算得出的。 - **2.4.3.3 类型**:`@Type` 注解用来定义属性的类型转换策略。 - **2.4.3.4 索引**:`@Index` 注解用于在属性上创建...
### Hibernate注解(Annoatation)中文版详解 #### 版本:3.2.0CR1 在Java开发领域中,Hibernate作为一款流行的开源对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者用面向对象的方式来处理数据库...
5. 高级映射注解:例如@Formula注解允许开发者插入数据库特定的SQL表达式,@SecondaryTable注解用于映射实体到多个表。 6. 缓存注解:@Cacheable注解可以指定实体或集合是可缓存的,以及使用的缓存策略。 7. 其他...
例如,可以通过指定@Formula来使用原生SQL查询来覆盖某些特定的计算字段,或者使用@NotFound(action=NotFoundAction.IGNORE)来优化外键关联的性能问题。 9. **元数据提取**:Hibernate可以自动从注解中提取元数据,...
- **公式:** `@Formula`注解用于定义基于其他属性计算得出的属性。 - **类型:** `@Type`注解用于指定自定义的数据类型转换器。 - **索引:** `@Index`注解用于定义索引。 - **@Parent:** 用于关联映射。 - *...
3. **@Formula:** 可以使用 SQL 表达式定义只读属性。 4. **@Cacheable:** 指示该实体可以被缓存。 5. **@Version:** 用于乐观锁定。 6. **@Cascade:** 控制级联操作。 7. **@Filter:** 定义动态过滤器。 ...
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. 多次...
- **公式**:使用 `@Formula` 注解来定义基于 SQL 表达式的计算属性。 - **类型**:使用 `@Type` 注解来指定自定义类型转换器。 - **索引**:使用 `@Index` 注解来指定索引。 - **@Parent**:用于表示实体之间的...