您的位置:首页 > 数据库

hibernate中的sql语句写在xxx.hbm.xml中解决hibernate中原生sql的硬编码问题

2017-12-02 16:38 369 查看

hibernate中的sql语句写在xxx.hbm.xml中解决hibernate中原生sql的硬编码问题

在hibernate的查询中,hibernate为我们提供了三种查询方式,hql查询、QBC查询以及原生sql查询,但是当我们在操作多张表查询的时候,我们通常会选择原生的sql查询来编写复杂的sql语句,但是如果我们直接把复杂的sql语句写在dao中,就会有硬编码的问题,当我们的需求发生变化的时候,我们就需要去修改源代码,这样其实对后期的维护是不好的。所以我们如果把原生的sql语句写在xml中,再引用到dao中,就可以解决这个硬编码的问题了,修改需求是,只需修改xml配置文件中的内容。并且可以解决sql代码的重复。其实我感觉它的主要的思想与mybaits中的思想是类似的。
下面我写了一个小例子:
Customer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.haha.domain.Customer" table="cst_customer">

<id name="cust_id">
<generator class="native"></generator>
</id>
<property name="cust_name"/>
<property name="cust_source"/>
<property name="cust_industry"/>
<property name="cust_level"/>
<property name="cust_phone"/>
<property name="cust_mobile"/>
<!-- 一方的配置,配置多方  name参考实体类中的属性字段     column参考数据库表中的字段 -->
<set name="linkmans" cascade="save-update,delete" inverse="true">
<!--  column参考数据库表中的字段  cid为外键的名称  -->
<key column="cid"/>
<!--class为多的那一方的全路径  -->
<one-to-many class="com.haha.domain.Linkman"/>
</set>
</class>
<!--
原生sql的sql语句,其中一定要加返回值类型,不然返回的是object数据,不能转化成你想要的类型
-->
<sql-query name="queryCustomer">
<return  class="com.h
4000
aha.domain.Customer"/>
<![CDATA[
select * from cst_customer
]]>
</sql-query>
<!--
hql语句查询,可以不加返回值。
-->
<query name="hqlQuery">
from Customer where cust_id=:cust_id
</query>
</hibernate-mapping>
注意:
第一种原生的sql语句编写中,一定要加返回值类型,如果返回的是由几张表组成的数据,可以再写一个pojo类,注意起别名与pojo类中的属性名相同。
测试:
/*
* 测试原生sql
*/
@Test
public void run4(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
Query query = session.getNamedQuery("queryCustomer");
List<Customer> list = query.list();
System.out.println(list.get(0).getCust_name());
tx.commit();
}
/*
* 测试hql查询
*/
@Test
public void run5(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
Query query = session.getNamedQuery("hqlQuery");
query.setLong("cust_id", 3L);//设置条件
List<Customer> list = query.list();
System.out.println(list.get(0).getCust_name());
tx.commit();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐