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(); }
相关文章推荐
- 使用Hibernate 5.0、4.0、3.0 createSQLQuery执行原生Sql语句 遇到问题及解决办法集锦
- 关于No Dialect mapping for JDBC type :-9 hibernate执行原生sql语句问题
- 详细解决用myEclips的db Browser连接到Oracle后,用反向工程Hibernate Reverse Engineering 生成.hbm.xml,POJD类还有DAO时出错的问题
- 关于No Dialect mapping for JDBC type :-9 hibernate执行原生sql语句问题
- Hibernate原生SQL查询多表关联,SQL语句要注意的问题
- Hibernate原生SQL查询多表关联,SQL语句要注意的问题
- 解决Hibernate原生SQL映射问题
- hibernate使用原生sql查询Hibernate原生SQL多表查询字段名重复问题以及解决方法
- mysql反向生成hbm.xml后,由hibernate向sql写数据中文出现乱码问题
- Hibernate中在xxx.hbm.xml文件中控制insert和update语句
- Eclipse中写Hibernate的hbm.xml文件时不自动提示的问题解决
- 关于hibernate纯sql查询返回结果集的问题(hbm.xml中不写多表关联)
- Hibernate中多表联合查询遇到的问题(原生态的SQL语句解决办法)
- Hibernate 执行原生sql语句字段名相同会被覆盖的问题
- 解决Hibernate原生SQL映射问题
- 解决Hibernate原生SQL映射问题 - SQL查询出来的结果映射为值对象
- 关于No Dialect mapping for JDBC type :-9 hibernate执行原生sql语句问题 .
- 解决Hibernate原生SQL映射问题
- 关于Hibernate在使用原生SQL语句多表查询所遇到的问题
- 关于No Dialect mapping for JDBC type :-9 hibernate执行原生sql语句问题