以前没有用过formula,今天试了试,
还是用学生和书本这个one-to-many关系来说明吧:
Students.hbm.xml:
<hibernate-mapping>
<class table="T_Students" name="com.hewill.model.Students">
<id type="java.lang.String" column="id" length="32" name="id">
<generator class="uuid.hex"/>
</id>
<property name="bookCount" formula="(select count(*) from T_Books )"/>
<property name="name" type="java.lang.String" column="name"/>
<property name="sex" type="java.lang.String" column="sex"/>
<property name="number" type="java.lang.String" column="number"/>
<set inverse="true" cascade="all" name="books">
<key column="student_id"/>
<one-to-many class="com.hewill.model.Books"/>
</set>
</class>
</hibernate-mapping>
Books.hbm.xml:
<hibernate-mapping>
<class table="T_Books" name="com.hewill.model.Books">
<id type="java.lang.String" column="id" length="32" name="id">
<generator class="uuid.hex"/>
</id>
<property name="bookname" type="java.lang.String" column="bookname"/>
<many-to-one column="student_id" name="studentid" class="com.hewill.model.Students"/>
</class>
</hibernate-mapping>
测试代码:
public static void main(String[] args) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
Query query = session.createQuery("from Students where name='liu'");
List<Students> list = query.list();
for(Students students : list){
System.out.println("name : "+students.getName());
System.out.println("number : "+students.getNumber());
System.out.println("bookCount : "+students.getBookCount());
}
tx.commit();
session.close();
}
结果:
Hibernate:
select
students0_.id as id0_,
students0_.name as name0_,
students0_.sex as sex0_,
students0_.number as number0_,
(select
count(*)
from
T_Books ) as formula0_
from
T_Students students0_
where
students0_.name='liu'
name : liu
number : 006
bookCount : 2
从hibernate执行的语句中,我们可以看到Students的bookCount属性是formula通过执行指定的“select count(*) from T_Books ”来获得的。bookCount字段在数据库T_Students表中是没有的,它是一个虚拟列。像这样,当我们需要用数据库来完成一些计算,并想获得这个计算结果时,完全可以用formula.
formula的使用注意事项网上很多,就不在提了。
分享到:
相关推荐
在软件开发领域,尤其是...总的来说,当遇到类似问题时,开发者需要仔细检查SQL语句的语法和结构,同时评估是否可以通过调整查询策略、优化数据模型或利用其他工具来避免直接在Hibernate映射文件中使用复杂的子查询。
在Java持久化框架Hibernate中,一对一(One-to-One)映射是对象关系映射的一种常见方式,用于表示两个实体之间一对一的关系。这种关系通常出现在一个实体的实例只能与另一个实体的单个实例相关联的情况。下面我们将...
2.4. Hibernate独有的注解扩展:除了标准的EJB3注解,Hibernate还提供了一些自定义注解,如`@GeneratedValue`用于设置主键生成策略,`@Formula`用于在属性中使用SQL表达式,`@Cache`用于配置缓存,`@Filter`用于动态...
Hibernate利用这种技术来简化和减少XML映射文件的使用,将映射信息直接写在Java类的注解中。 Hibernate Annotations是Hibernate框架的一部分,它提供了一套注解,用于实现ORM映射。通过使用注解,开发者可以在不...
在Java实体类中使用`@Formula`注解,通常会结合JPA或Hibernate等ORM框架。下面通过一个具体的例子来说明如何使用`@Formula`: ```java @Entity public class News { private int id; private String title; ...
- **映射简单属性**: - 基本的属性映射:使用`@Column`注解来指定列名等信息。 - 映射列属性:可以通过`@Column`注解的参数如`name`、`nullable`、`length`等来更详细地定义列。 - **嵌入式对象**:对于复杂的...
《Hibernate Annotations 中文帮助文档》提供了关于如何在Java应用程序中使用Hibernate ORM框架进行数据库映射的详细指南。Hibernate Annotations是Hibernate框架的一部分,它允许开发者使用Java注解来定义对象关系...
1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 ...
9.1.7. 隐式多态和其他继承映射混合使用 9.2. 限制 10. 与对象共事 10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.1.1. 迭代式获取结果(Iterating ...
1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 ...
- **2.2.2.4 无注解之属性的默认值**:如果未使用注解,Hibernate 会按照默认规则进行映射。 - **2.2.3 映射主键属性** - 主键属性的映射可以通过 `@Id` 注解来完成,该注解还可以与 `@GeneratedValue` 配合使用以...
《Hibernate Annotations中文帮助文档》是针对Java开发人员的一份详细指南,主要讲解如何使用Hibernate ORM框架中的注解来实现数据库对象的映射。该文档涵盖了从基础到高级的各种概念,帮助开发者更高效地管理和操作...
除了通过注解配置实体映射之外,还可以使用 XML 文件或者基于 Java 的配置方式来定制更复杂的映射规则。 #### 总结 通过使用 Hibernate Annotations,开发者能够以一种更为简洁和灵活的方式定义对象关系映射规则。...
1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 ...
1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 ...
- **无注解之属性的默认值**:如果没有使用注解,Hibernate 会按照默认规则来处理属性的映射。 - **映射主键属性** - 使用 `@Id` 注解来标识主键属性。 - 可以使用 `@GeneratedValue` 来指定主键生成策略,如...
- Hibernate允许在`<property>`标签中通过`insert="false"`来控制是否插入某个字段,或者使用`formula`属性指定SQL表达式,如子查询,以处理数据库中没有直接映射的属性。 4. Hibernate API接口: - **访问数据库...
- **5.1.22 字段和规则元素 (column and formula elements)**:描述字段和公式元素的使用方法。 - **5.1.23 引用 (import)**:说明如何导入外部实体类。 - **5.1.24 Any**:解释 any 元素的使用场景。 #### 6. ...
- **公式**:使用 `@Formula` 注解来定义计算属性。 - **类型**:使用 `@Type` 注解来指定自定义类型。 - **索引**:使用 `@Index` 注解来定义索引。 - **继承**:使用 `@Inheritance` 注解来定义继承策略。 - **...
- **无注解之属性的默认值:** 如果没有显式使用注解,Hibernate会默认将类的属性映射到表中的列。 - **映射主键属性:** 主键映射通过`@Id`注解实现。 - **映射继承关系:** - **每个类一张表:** 每个子类对应...