Hibernate hbm中维护sql和formula的运用

42 篇文章 0 订阅

Hibernate 执行自定义的数据库本地sql 可灵活用于自定义的复杂增删改查

在Hibernate 资源文件中定义复杂的自定义sql,可灵活用于自定义的复杂增删改查 
此方法不限于以前的hibernate是注解方式还是xml声明实体类。 

一 定义包含自定义sql的资源文件:directSql.hbm.xml 
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  4.   
  5. <hibernate-mapping>  
  6.     <sql-query name="mergeTargetScore">  
  7.        <![CDATA[ 
  8.        update t_duty_target_dtl set  target_Scorelevel_Id =:newId where duty_Target_Dtl_Id = :id 
  9.       ]]>  
  10.     </sql-query>  
  11. </hibernate-mapping>  


二 在hibernate。cfg。xml中包含此文件 
Xml代码   收藏代码
  1. <hibernate-configuration>  
  2.   
  3.     <session-factory>  
  4.         <property name="dialect">  
  5.             org.hibernate.dialect.Oracle9Dialect  
  6.         </property>  
  7.         <property name="connection.url">  
  8.             jdbc:oracle:thin:@192.168.1.55:1521:orcl  
  9.         </property>  
  10. 。。。     <property name="myeclipse.connection.profile">  
  11.             ora4sljx  
  12.         </property>  
  13.   
  14.         <mapping resource="com/jadetrust/sljx/db/directSql.hbm.xml" />  
  15.           
  16.   
  17. <mapping class="com.jadetrust.sljx.db.domain.TWorkLogTarget" />  
  18.         <mapping class="com.jadetrust.sljx.db.domain.TReconDtl" />  

三 在java中调用自定义sql 
Java代码   收藏代码
  1. public static void update1(Long whereID, Long destID) {  
  2.     HibernateSessionFactory.getSession().getTransaction().begin();  
  3.   
  4.     Session s = HibernateSessionFactory.getSession();  
  5.     Query q = s.getNamedQuery("mergeTargetScore");  
  6.     q.setParameter("id", whereID);  
  7.     q.setParameter("newId", destID);  
  8.     q.executeUpdate();  
  9.   
  10.     HibernateSessionFactory.getSession().getTransaction().commit();  
  11. }  

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


问题描述:

      数据库商品表中有价钱与折扣两个字段,现要求查询商品信息,按打完拆之后的价钱升序排列。

formula :  

      hibernate 中的formula属性允许在ORM映射时根据自定义公式或表达式(sql语句)生成实现类中的新的属性,并且新的属性可用于HQL查询。

实现过程:

      实体类中添加自定义属性real_price:

      

[java]  view plain copy
  1. //原价  
  2. private Double price;  
  3. //折扣属性  
  4. private Integer discount;  
  5. //折算之后的价钱  
  6. private double real_price;  

       在映射文件中加入关于real_price的配置:

      

[c-sharp]  view plain copy
  1. <property name="real_price" formula="  
  2.  (select p.price*p.discount/100   
  3.  from product p where p.id=id)">  
  4. </property>  

       注意:formula属性中定义的公式是SQL语句而不是HQL。

                SQL语句包含在小括号内。

                表名必须有别名。

                where条件中p.id=id代表当前对象的id属性值等于表中某列的值。

        

        查询代码:

        

[c-sharp]  view plain copy
  1. Query query = session.createQuery("from" +  
  2. duct p order by p.real_price");  
  3. list = query.list();  
  4. session.close();  
  5. return list;  

        执行完成后查看hibernate生成的sql语句为:

       

[c-sharp]  view plain copy
  1. select id , name, price,discount,     
  2. (select p.price*p.discount/100 from product p where p.id=product0_.id)  
  3. as formula0_ from product.dbo.product product0_ order by     
  4. (select p.price*p.discount/100       
  5. from product p where p.id=product0_.id)  

 

formula属性除可用在property标签中外,还可用于discriminator等其它标签。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值