文档章节

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

业余编程人士
 业余编程人士
发布于 2014/02/28 16:19
字数 640
阅读 1975
收藏 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
59
0
数据库派生属性

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

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

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

杰克鹏仔
2016/03/27
99
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL参数search_path影响及作用

search_path稍微熟悉PG就会用到,用法这里就不必讲,本篇主要讲它在程序里怎样处理。 1、GUC参数定义 这是个 config_string 参数 {{"search_path", PGC_USERSET, CLIENT_CONN_STATEMENT,...

有理想的猪
今天
8
0
Qt程序各个平台打包发布及安装程序大全

本文链接:https://blog.csdn.net/zhengtianzuo06/article/details/78468111 通用: 1.准备图标 图标可以直接使用一般格式的图片制作, 比如jpg, png等 推荐使用Photoshop制作原始图 推荐使用I...

shzwork
今天
4
0
springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
22
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
10
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部