`
徜徉の小溪
  • 浏览: 447546 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hibernate hbm.xml中查询数据作为虚拟列Formula使用

阅读更多

Hibernate 中的Formula 攻略(转载)

键字: 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

 

Java代码 复制代码
  1. package aa;   
  2.   
  3. import static javax.persistence.GenerationType.IDENTITY;   
  4.   
  5. import javax.persistence.Entity;   
  6. import javax.persistence.GeneratedValue;   
  7. import javax.persistence.Id;   
  8. import javax.persistence.Table;   
  9.   
  10. import org.hibernate.annotations.Formula;   
  11.   
  12. /**  
  13.  * 注解必须是在属性上的,如果有任何一个注解在方法上,那么@Formula将失效  
  14.  * @author 昆明蜂鸟软件  
  15.  * @version 0.1.0 2008-7-15 下午06:09:38  
  16.  */  
  17. @Entity  
  18. @Table(name = "user", catalog = "test")   
  19. public class User {   
  20.        
  21.     @Id  
  22.     @GeneratedValue(strategy = IDENTITY)   
  23.     private int id;   
  24.   
  25.     @Formula("(select COUNT(*) from user)")   
  26.     private int count;   
  27.   
  28.     public int getId() {   
  29.         return id;   
  30.     }   
  31.   
  32.     public void setId(int id) {   
  33.         this.id = id;   
  34.     }   
  35.   
  36.     public int getCount() {   
  37.         return count;   
  38.     }   
  39.   
  40.     public void setCount(int count) {   
  41.         this.count = count;   
  42.     }   
  43. }  

 

 

 

 数据库表:

Sql代码 复制代码
  1. CREATE TABLE  `test`.`user` (   
  2.   `id` int(10) unsigned NOT NULL auto_increment,   
  3.   PRIMARY KEY  USING BTREE (`id`)   
  4. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;  

 

 

细节1.使用@Formula 你的注解必须是在属性上,如果有一个注解在方法上,那么@Formula将失效。这个我是做过实验的,比如把以上的java文件改为:

Java代码 复制代码
  1. package aa;   
  2.   
  3. import static javax.persistence.GenerationType.IDENTITY;   
  4.   
  5. import javax.persistence.Entity;   
  6. import javax.persistence.GeneratedValue;   
  7. import javax.persistence.Id;   
  8. import javax.persistence.Table;   
  9.   
  10. import org.hibernate.annotations.Formula;   
  11.   
  12. /**  
  13.  * 注解必须是在属性上的,如果有任何一个注解在方法上,那么@Formula将失效  
  14.  * @author 昆明蜂鸟软件  
  15.  * @version 0.1.0 2008-7-15 下午06:09:38  
  16.  */  
  17. @Entity  
  18. @Table(name = "user", catalog = "test")   
  19. public class User {   
  20.        
  21.     private int id;   
  22.   
  23.     @Formula("(select COUNT(*) from user)")   
  24.     private int count;   
  25.        
  26.     @Id  
  27.     @GeneratedValue(strategy = IDENTITY)   
  28.     public int getId() {   
  29.         return id;   
  30.     }   
  31.   
  32.     public void setId(int id) {   
  33.         this.id = id;   
  34.     }   
  35.   
  36.     public int getCount() {   
  37.         return count;   
  38.     }   
  39.   
  40.     public void setCount(int count) {   
  41.         this.count = count;   
  42.     }   
  43. }  

 

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

分享到:
评论

相关推荐

    hibernate.hbm.xml详解

    在Java的持久化框架Hibernate中,`hibernate.hbm.xml`文件是至关重要的,它定义了Java对象与数据库表之间的映射关系,使得对象模型能够与关系型数据库无缝对接。这篇文章将深入解析`hibernate.hbm.xml`的结构和主要...

    Hibernate-tools解决hbm.xml中文注释乱码和生成实体类注释

    在使用`Hibernate-tools`生成或更新`hbm.xml`文件时,可以通过命令行指定`-encoding UTF-8`参数来确保中文注释的正确输出。 2. **生成实体类注释** `Hibernate-tools`提供了一种方式来自动生成与数据库表对应的...

    在myeclipse中根据表结构生成实体和hbm.xml文件

    在 MyEclipse 中,我们可以使用 Hibernate 根据现有的数据库表结构生成实体和 hbm.xml 配置文件,这样可以避免手动编写 JPA 或 Hibernate 实体类。下面是生成实体和 hbm.xml 文件的步骤: 首先,需要创建一个 JPA ...

    利用hibernate自动生成hbm.xml文件和entity类.doc

    3. 将 hbm.xml 文件加入到 application.mappinginfo.xml 中:将 hbm.xml 文件加入到 application.mappinginfo.xml 中,以便于 Hibernate 可以正确地加载映射关系。 五、 小结 通过以上步骤,开发者可以使用 ...

    自动生成Hibernate类文件和hbm.xml文件

    通过myeclipse自动生成Hibernate类文件和hbm.xml文件,链接数据库库自动生成

    hibernate.queries.hbm.xml

    hibernate.queries.hbm.xml这个文件需要放在jbpm*(版本).jar中。。的org.jbpm.db目录下,先删除以前的文件,然后,换上共享中这个。。大家可以用文件比较器看看,并没有改变以前的,只是新加了。。

    hbm.xml文件中的name名字与实体类中不符合

    hbm.xml文件中的name名字与实体类中不符合.

    Hibernate的........htm.xml和hibernatecfg.xml配置

    理解并正确配置Hibernate的`.hbm.xml`和`hibernate.cfg.xml`文件是使用Hibernate的关键步骤。`.hbm.xml`文件负责对象-关系的映射,`hibernate.cfg.xml`文件则包含了整个应用程序的数据库连接和其他配置。通过阅读...

    hibernate。hbm.xml配置详解

    在 Hibernate 中,`hbm.xml` 文件是用于定义对象与数据库表之间映射的元数据文件。这篇文档将深入解析 `hbm.xml` 配置的各个方面。 ### 1. `hbm.xml` 文件结构 `hbm.xml` 文件的开头通常包含 XML 声明和 DTD 引用...

    使用MyEclipse工具生成POJO类和映射文件.hbm.xml

    在 MyEclipse 中,我们可以使用 Hibernate 工具来生成 POJO 类和映射文件 .hbm.xml。 首先,我们需要在 MyEclipse 中添加 Hibernate 支持。我们可以右键点击工程,在弹出的菜单中选择“Add Hibernate Capabilities...

    根据实体类自动生成hibernate的hbm.xml映射文件

    请输入包的名称和映射文件需要放到的文件夹之后运行CreateTableXml里的main方法,就可以自动生成映射文件了。记着刷新文件夹,要不然是看不到的。 当然只是一些基础的属性。对于一些比较复杂,还是需要自己来修改的...

    利用Middlegen Hibernate3生成hbm.xml配置和java类

    标题中的“利用Middlegen Hibernate3生成hbm.xml配置和java类”指的是使用Middlegen工具来自动化创建Hibernate3框架所需的映射文件(hbm.xml)和对应的Java实体类。这个过程是数据库对象到Java对象(O/R Mapping)的...

    MyEclipse生成hbm.xml文件(全图解)

    本篇文章将详细解释如何在MyEclipse中生成hbm.xml文件,这是一个关键的步骤,因为它关联了数据库表与Java实体类,使得数据操作变得更加便捷。 首先,打开MyEclipse,通过工具栏中的`Window` -> `Show view` -> `...

    Hibernate逆向生成entity和hbm.xml文件

    在开发过程中,为了减少手动编写实体类(Entity)和对应的hbm.xml配置文件的工作量,Hibernate提供了一个逆向工程工具,可以基于现有数据库结构自动生成这些代码。 实体类是Java对象,它们代表数据库中的表,而hbm....

    Hibernate关联关系hbm.xml中的相关属性

    在hbm.xml文件中,我们可以使用`<many-to-one>`, `<one-to-many>`, 和 `<many-to-many>`标签来定义这些关联。下面将详细介绍这三个标签及其相关属性。 首先,我们来看`<many-to-one>`标签,它表示多对一的关系。...

    spring如何摒弃hibernate.cfg.xml

    在现代的Spring应用程序中,整合Hibernate时,我们通常会选择使用Spring的IoC(Inversion of Control)容器来管理数据访问层,而不是直接依赖于Hibernate的配置文件`hibernate.cfg.xml`。这是因为Spring提供了更高级...

    Hibernate4的全套jar包,及hbm.xml(模板)+hibernate.cfg.xml(模板)+c3p0(全套)+ojdbc14.jar

    “hbm.xml(模板)”是Hibernate的映射文件,它定义了Java类与数据库表之间的映射关系。开发者会在这里指定实体类的名称、属性与数据库表字段的对应,以及关联规则等。通过这种方式,Hibernate能够自动处理数据的...

    Oracle自动生成hibernate实体(.java 和.hbm.xml文件)存储过程

    本主题聚焦于如何在Oracle环境中自动生成Hibernate实体类(`.java`文件)及其对应的映射文件(`.hbm.xml`文件)。这个过程通常是为了减少手动编写这些文件的工作量,提高开发效率。 首先,我们需要理解`Oracle`存储...

    使用Hibernate逆向生成实体类的方法(注解和hbm.xml映射文件)

    - 对于通过hbm.xml生成的实体类,需要在hibernate.cfg.xml中添加相应的映射文件路径。 3. **测试连接**: - 运行测试程序,验证Hibernate是否能够正确读取映射信息并与数据库交互。 通过以上步骤,我们不仅能够...

    hibernate.cfg.xml 配置 和数据库驱动

    在Java Web开发中,Hibernate是一个非常流行的持久化框架,它简化了数据库操作,使开发者能够更专注于业务逻辑而不是底层数据存储。而`hibernate.cfg.xml`文件是Hibernate的核心配置文件,用于设置数据库连接参数、...

Global site tag (gtag.js) - Google Analytics