文档章节

Hibernate 中<Property>中的formula属性的使用

业余编程人士
 业余编程人士
发布于 2014/02/28 16:19
字数 640
阅读 1983
收藏 3

Hibernate 中 formula属性的好用处在于 无需在数据库有真实的列 只需要写出sql 就可以创建一个虚拟的列 然后在 Dao层的查询中使用 ,比如在表 M_Confirmation 中有两列 Confirmation_Cost Confirmation_Fee 这两列都容许包含null, 我们的query要求取得 Confirmation_Cost 和 Confirmation_Fee的和(暂时命名为Total_Price) 并查出此Total_Price>= 某个前台传进来的某个filter的数据 。

写成sql 就是 select (confirmation_cost + confirmation+fee) from m_confirmation where (confirmation_cost + confirmation+fee) >= ? ;

这时候创建虚拟列 ,formula后面的部分 会自动跟在hibernate发出的sql中 select后面作为一列 就好比 select formula from M_confirmation:

<property name="totalPrice" formula="((CASE WHEN Confirmation_Cost IS NULL THEN 0 ELSE Confirmation_Cost END) + (CASE WHEN Confirmation_Fee IS NULL THEN 0 ELSE Confirmation_Fee END))" />

注意:数据库中任何数+null都是null,所以必须用case when处理, 不能 用 nvl因为 nvl只能用于oracle 不符合hibernate移植到任何数据库的思想。

然后在 持久化对象中 写好对应的 totalPrice 属相:

public class Confirmation extends ConfirmationBase implements BasicModel {
    private BigDecimal totalPrice;

    public BigDecimal getTotalPrice() {
        return totalPrice;
    }

    public void setTotalPrice(BigDecimal totalPrice) {
        this.totalPrice = totalPrice;
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, TafToStringStyles.PERSISTENCE_TOSTRING_STYLE);
    }

这样 你就可以灵活使用数据库中任何列 排列组合成一些虚拟列 来做查询了:

        BigDecimal bpsPrice = filter.getBpsPrice();
        DetachedCriteria criteria = DetachedCriteria.forClass(Confirmation.class);
        if (bpsPrice != null) {
            criteria.add(Restrictions.ge("totalPrice", bpsPrice));
        }
        return getHibernateTemplate().findByCriteria(criteria);

这就是属性中 formula属性的用处,最后再提醒一下 formula=配置的内容会自动跟在发出的sql的 select后面作为一列 ,所以很多人 后面写出完整的 select 最后拼出的sql是错误的。这样工作中方便更加区分逻辑 加快代码可读性 对数据库列的数量也没有太多影响,

当然你也可以在 Criteria中直接写 如下:

    BigDecimal bpsPrice = filter.getBpsPrice();
        DetachedCriteria criteria = DetachedCriteria.forClass(Confirmation.class);
        if (bpsPrice != null) {
           criteria
            .add(Restrictions.sqlRestriction("((CASE WHEN Confirmation_Cost IS NULL THEN 0 ELSE Confirmation_Cost END) + (CASE WHEN Confirmation_Fee IS NULL THEN 0 ELSE Confirmation_Fee END)) >=") + bpsPrice );
        }
        return getHibernateTemplate().findByCriteria(criteria);

但是这样的写法严格的公司无法通过代码审核,因为不方便阅读 没有做到好的分层  假设新来的程序员如果改了表的列名而没有看到你写的这句会出现bug 一般这样写会被打回来从新改

如果你公司普遍使用Native sql 或者 HQL来做查询的标准 那这种formula配置就失去作用 没有用处了 完全可以用一些常量替代

© 著作权归作者所有

业余编程人士
粉丝 5
博文 19
码字总数 9137
作品 0
其他
程序员
私信 提问
Hibernate 中 formula的简单应用

在一个项目的某一个查询场景中,TEACHER表是主表,STUDENT表是TEACHER的子表,两者是以一对多的方式关联。业务逻辑需要查询多条TEACHER表的数据,并且在查询出每条A表数据的同时还需要将对应...

mr桀骜不驯
2013/03/09
1K
0
Hibernate 中中的formula属性

Property元素中的formula允许对象属性包含导出值,比如sum、average、max等的结果。如: <property name="averagePrice" formula="(select avg(pc.price) from PriceCatalogue pc, SelectedI......

街头浪子
2016/01/18
151
0
Hibernate 映射基础 单个持久类与单个数据库表映射

一、单个持久化类与单个数据库表映射基础 1、在Hibernate应用中,持久化类的访问方法有两个调用者:(默认的持久化类要有默认的构造函数、setXX、getXXX方法) ①、Java应用程序:调用User对象...

Winnie007
2015/08/18
60
0
数据库派生属性

派生属性写法:(只在hibernate框架下使用过,其他没有测试。) (主要解决一个实体javabean有A字段,但是本实体对象对应的数据表没有A字段。需要从其他表中获取本字段) 从其他数据库获取数...

李永china
2016/04/27
64
0
学习hibernate(四) -- hibernate常用配置

hibernate.cfg.xml的常用属性配置。 在进行项目开发时,建议选择一款数据源包来托管数据库连接。hibernate包中有一组包叫c3p0,它是一个开源的JDBC连接池,实现了数据源与JNDI绑定,支持JDB...

杰克鹏仔
2016/03/27
99
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
38分钟前
4
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
49分钟前
4
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
58分钟前
6
0
从零基础到拿到网易Java实习offer,我做对了哪些事

作为一个非科班小白,我在读研期间基本是自学Java,从一开始几乎零基础,只有一点点数据结构和Java方面的基础,到最终获得网易游戏的Java实习offer,我大概用了半年左右的时间。本文将会讲到...

Java技术江湖
昨天
5
0
程序性能checklist

程序性能checklist

Moks角木
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部