Hibernate操作视图
首先我们要知道,对于视图其实就是存储了一条sql语句,对多个表进行关联查询后得到一个视图,对于关联较多的表可以很方便,hibernate可以使用两种操作方法
一,在数据库中建立视图,然后可以把视图当做普通的表一样进行映射操作
需要注意的是,可以使用rownum 来做视图的主键,主要就不需要使用主键类来设置
CREATE OR REPLACE VIEW V_SHGW_SAFESTOCK AS
SELECT rownum id,pro.productid,pro.productname 。。。。FROM 。。。。
映射文件
<hibernate-mapping>
<class name="com.dg11185.shgw.pojo.warehouse.VShgwSafestock" table="V_SHGW_SAFESTOCK" schema="SHGW">
<id name="id" type="java.lang.Long">
<column name="ID" precision="0" />
<generator class="native" />
</id>
<property name="productid" type="java.lang.Long">
<column name="PRODUCTID" precision="10" scale="0" />
</property>
<property name="productname" type="java.lang.String">
<column name="PRODUCTNAME" />
</property>
....
</class>
</hibernate-mapping>
二,在数据库中建立视图,然后可以把视图当做普通的表一样进行映射操作
/**
* 销售单据视图的ID类
*
* @author 黄文韬
* @since 1.0
* @Copyright 2013 东莞市邮政局All rights reserved.
*/
public class ExchangegoodsViewId implements Serializable{
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
//视图类
public class ExchangegoodsView implements java.io.Serializable {
private ExchangegoodsViewId exchangeViewId;
private Long orderid;
private String username;
private String telephone;
private String invoicenum;
private Double spreadprice;
//字段和setter/getter方法省略
}
一,
<?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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.dg11185.shgw.pojo.sales.ExchangegoodsView" table="EXCHANGEGOODS_VIEW" schema="SHGW">
<!-- 由于视图没有主键,需要挑选出一个不为空的唯一标志字段,为视图主键,这里选用主表的主键作为视图的逐渐字段 -->
<composite-id class="com.dg11185.shgw.pojo.sales.ExchangegoodsViewId" name="exchangeViewId"> //name是视图Id类在视图类中的属性名字
<key-property name="id" type="java.lang.Long">//name是视图Id类中id的属性名字
<column name="EXCHANGEID" precision="10" scale="0" />
</key-property>
</composite-id>
<property name="orderid" type="java.lang.Long">
<column name="ORDERID" precision="15" scale="0" />
</property>
<property name="username" type="java.lang.String">
<column name="USERNAME" length="20" />
</property>
<property name="telephone" type="java.lang.String">
<column name="TELEPHONE" length="20" />
</property>
<property name="invoicenum" type="java.lang.String">
<column name="INVOICENUM" length="20" />
</property>
。。、、、属性省略
</property>
</class>
</hibernate-mapping>
实体类就是普通的实体类!
注意:在视图中,oracle要求自定义的列名要大写
create or replace view productview as
select pdt.productid,pdt.name as "PRODUCTNAME",pdt.amount,pdt.price,pdt.year,pdt.avggrade, cls.classid,cls.parentid, cls.name as "CLASSNAME", img.url,pdt.storeid,st.name as "STORENAME"
from tb_zhjy_product pdt left join Tb_Zhjy_Product_Class pcs on pcs.productid = pdt.productid
join tb_zhjy_class cls on pcs.classid = cls.classid
left join tb_zhjy_images img on pdt.productid = img.relatedid
left join tb_zhjy_store st on st.storeid = pdt.storeid
where img.sequence=1 and img.usage=0 and
pdt.status = 1 and pdt.banstatus = 0
三,Hibernate操作视图,此视图是把sql语句放在hibernate的配置文件中:
1, 首先确定一下通过视图要得到的字段信息,建立一个普通的bean类
package com.hwt.view;
public class EmpDep implements java.io.Serializable {
private String asid;
private String called;
private String declaration;
...
(生成setter getter方法)
}
2,建立一个配置文件 对应着上面的类名:EmpDep.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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<!— name里面对应着一个普通的bean类,entity-name是视图的名字 -->
<class name="com.hwt.view.EmpDep " entity-name="EmpDep">
<!-- 建立视图的sql语句 -->
<subselect>
<!--此处写sql语句-->
Select empId,empName,depName from emp,dep where emp.depId = dep.depId;
</subselect>
<!--注意顺序,这里是说下面的表数据变后查询视图的数据也变 -->
<synchronize table="TB_Emp "/>
<synchronize table="TB_Dep"/>
<!-- 对应上面sql查出来的属性 -->
<composite-id>
<key-property name="empId" column="EMPID" type="string" />
</composite-id>
<property name="empName" column="EMPNAME" type="string" />
<property name="depId" column="DEPID" type="string" />
</class>
</hibernate-mapping>