Hibernate 执行自定义的数据库本地sql 可灵活用于自定义的复杂增删改查
在Hibernate 资源文件中定义复杂的自定义sql,可灵活用于自定义的复杂增删改查
此方法不限于以前的hibernate是注解方式还是xml声明实体类。
一 定义包含自定义sql的资源文件:directSql.hbm.xml
二 在hibernate。cfg。xml中包含此文件
三 在java中调用自定义sql
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
此方法不限于以前的hibernate是注解方式还是xml声明实体类。
一 定义包含自定义sql的资源文件:directSql.hbm.xml
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <sql-query name="mergeTargetScore">
- <![CDATA[
- update t_duty_target_dtl set target_Scorelevel_Id =:newId where duty_Target_Dtl_Id = :id
- ]]>
- </sql-query>
- </hibernate-mapping>
二 在hibernate。cfg。xml中包含此文件
- <hibernate-configuration>
- <session-factory>
- <property name="dialect">
- org.hibernate.dialect.Oracle9Dialect
- </property>
- <property name="connection.url">
- jdbc:oracle:thin:@192.168.1.55:1521:orcl
- </property>
- 。。。 <property name="myeclipse.connection.profile">
- ora4sljx
- </property>
- <mapping resource="com/jadetrust/sljx/db/directSql.hbm.xml" />
- <mapping class="com.jadetrust.sljx.db.domain.TWorkLogTarget" />
- <mapping class="com.jadetrust.sljx.db.domain.TReconDtl" />
三 在java中调用自定义sql
- public static void update1(Long whereID, Long destID) {
- HibernateSessionFactory.getSession().getTransaction().begin();
- Session s = HibernateSessionFactory.getSession();
- Query q = s.getNamedQuery("mergeTargetScore");
- q.setParameter("id", whereID);
- q.setParameter("newId", destID);
- q.executeUpdate();
- HibernateSessionFactory.getSession().getTransaction().commit();
- }
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
问题描述:
数据库商品表中有价钱与折扣两个字段,现要求查询商品信息,按打完拆之后的价钱升序排列。
formula :
hibernate 中的formula属性允许在ORM映射时根据自定义公式或表达式(sql语句)生成实现类中的新的属性,并且新的属性可用于HQL查询。
实现过程:
实体类中添加自定义属性real_price:
- //原价
- private Double price;
- //折扣属性
- private Integer discount;
- //折算之后的价钱
- private double real_price;
在映射文件中加入关于real_price的配置:
- <property name="real_price" formula="
- (select p.price*p.discount/100
- from product p where p.id=id)">
- </property>
注意:formula属性中定义的公式是SQL语句而不是HQL。
SQL语句包含在小括号内。
表名必须有别名。
where条件中p.id=id代表当前对象的id属性值等于表中某列的值。
查询代码:
- Query query = session.createQuery("from" +
- duct p order by p.real_price");
- list = query.list();
- session.close();
- return list;
执行完成后查看hibernate生成的sql语句为:
- select id , name, price,discount,
- (select p.price*p.discount/100 from product p where p.id=product0_.id)
- as formula0_ from product.dbo.product product0_ order by
- (select p.price*p.discount/100
- from product p where p.id=product0_.id)
formula属性除可用在property标签中外,还可用于discriminator等其它标签。