hibernate映射视图

[color=green][size=x-small]因为一个报表需要的统计需要连接3张表,而且sql语句比较复杂,并且三张表都是百万数量级的数据。所有开始我

选择的是native SQL的方式去执行这个查询。但是问题来了,因为我们公司的框架JSP页面的展现是使用EC控件,而且

封装的方法在这里不能使用原生sql的方式,所有我只能选择建立视图。

建立视图后,使用Eclipse去映射这个视图,我在想,视图没有主键。而且自动生成的配置文件和相关的POJO类

发生了变化:

生成的POJO类有两个,一个跟表名对应的POJO类只有一个属性,就是一个 为 ID 的属性名 , 而且只有这一

个属性。 数据库表名Test ,POJO类Test.java代码如下:
public class Test implements java.io.Serializable {

private TestId id;

public Test() {
}

public Test(TestId id) {
this.id = id;
}

public TestId getId() {
return this.id;
}

public void setId(TestId id) {
this.id = id;
}

}

还一个pojo类是:TestId.java
这个类却包含了视图的所有字段映射:
public class TaizhangTestId implements java.io.Serializable {

// Fields

private String tname;
private String dname;
private String dtype;
private String plevel;
private String xinghao;
private String leavefactorysn;
private String dfactory;
private Date madedate;
private Date leavefactorydate;
private String remarks;
private Long did;
private Long pid;
}而且这个类重写了 hashcode()方法和equals()方法

配置文件如下: test.hbm.xml只有一个

<hibernate-mapping>
<class name="com.mytest.biz.mynext.pojo.Test" table="TEST" >
<composite-id name="id" class="com.mytest.biz.mynext.pojo.hbm.TestId">
<key-property name="pname" type="java.lang.String">
<column name="PNAME" length="200" />
</key-property>
<key-property name="dname" type="java.lang.String">
<column name="DNAME" length="200" />
</key-property>
<key-property name="dtype" type="java.lang.String">
<column name="DTYPE" length="200" />
</key-property>
<key-property name="plevel" type="java.lang.String">
<column name="PLEVEL" length="10" />
</key-property>
<key-property name="xinghao" type="java.lang.String">
<column name="XINGHAO" length="100" />
</key-property>
<key-property name="leavefactorysn" type="java.lang.String">
<column name="LEAVEFACTORYSN" length="100" />
</key-property>
<key-property name="dfactory" type="java.lang.String">
<column name="DFACTORY" length="100" />
</key-property>
<key-property name="madedate" type="java.util.Date">
<column name="MADEDATE" length="7" />
</key-property>
<key-property name="leavefactorydate" type="java.util.Date">
<column name="LEAVEFACTORYDATE" length="7" />
</key-property>
<key-property name="remarks" type="java.lang.String">
<column name="REMARKS" length="1024" />
</key-property>
<key-property name="did" type="java.lang.Long">
<column name="DID" precision="22" scale="0" />
</key-property>
<key-property name="pid" type="java.lang.Long">
<column name="PID" precision="22" scale="0" />
</key-property>
</composite-id>
</class>
</hibernate-mapping>

由于框架的限制,我在JSP页面不能使用<c:out property="pojo属性名"/>的方式去展现结果集。因为你的action

中查询的对象是Test,而你需要的属性名全在TestId中。

没有办法,我只能尝试着去修改配置文件,这个是重点:
<hibernate-mapping>
<class name="class name="com.mytest.biz.mynext.pojo.TestId" table="TEST">
<id name="did" type="java.lang.Long"> //我把did强行指定为主键,而且把标签<key-property改成<property ,而且去除了 原配置文件<composite-id 指定主键的方式

<column name="did" precision="22" scale="0" />
<generator class="native" />
</id>
<property name="pname" type="java.lang.String">
<column name="PNAME" length="200" />
</property>
<property name="dname" type="java.lang.String">
<column name="DNAME" length="200" />
</property>
<property name="dtype" type="java.lang.String">
<column name="DTYPE" length="200" />
</property>
<property name="plevel" type="java.lang.String">
<column name="PLEVEL" length="10" />
</property>
<property name="xinghao" type="java.lang.String">
<column name="XINGHAO" length="100" />
</property>
<property name="leavefactorysn" type="java.lang.String">
<column name="LEAVEFACTORYSN" length="100" />
</property>
<property name="dfactory" type="java.lang.String">
<column name="DFACTORY" length="100" />
</property>
<property name="madedate" type="java.util.Date">
<column name="MADEDATE" length="7" />
</property>
<property name="leavefactorydate" type="java.util.Date">
<column name="LEAVEFACTORYDATE" length="7" />
</property>
<property name="remarks" type="java.lang.String">
<column name="REMARKS" length="1024" />
</property>
<property name="pid" type="java.lang.Long">
<column name="PID" precision="22" scale="0" />
</property>
</class>
</hibernate-mapping>

结果居然成功执行数据库查询[/size][/color]

----------------------------------------------------------------------
第二种 方法

Hibernate对视图的操作
Hibernate对视图进行操作时和对普通的表有些不同,下面就是一个Hibernate操作视图的例子:
视图:
SELECT a.SPID, a.SPKey, b.serviceID, b.serviceName, c.serviceItemID, c.itemName
FROM dbo.tbSPInfo a
INNER JOIN dbo.tbService b ON a.SPID = b.SPID LEFT OUTER JOIN
dbo.tbServiceItem c ON b.serviceID = c.serviceID

1.首先根据视图中的字段定义一个bean


package com.txsec.lc.is.bean;

import java.io.Serializable;

public class ServiceId implements Serializable {
private static final long serialVersionUID = - 2298938310945830572L ;
private String spId;
private String spKey;
private String serviceId;
private String serviceName;
private String serviceItemId;
private String itemName;
public ServiceId() ... {
super ();
}
public String getItemName() ... {
return itemName;
}
public void setItemName(String itemName) ... {
this .itemName = itemName;
}
public String getServiceId() ... {
return serviceId;
}
public void setServiceId(String serviceId) ... {
this .serviceId = serviceId;
}
public String getServiceItemId() ... {
return serviceItemId;
}
public void setServiceItemId(String serviceItemId) ... {
this .serviceItemId = serviceItemId;
}
public String getServiceName() ... {
return serviceName;
}
public void setServiceName(String serviceName) ... {
this .serviceName = serviceName;
}
public String getSpId() ... {
return spId;
}
public void setSpId(String spId) ... {
this .spId = spId;
}
public String getSpKey() ... {
return spKey;
}
public void setSpKey(String spKey) ... {
this .spKey = spKey;
}
}
...

2.定义一个bean,用组合方式将ServiceId包含进去


package com.txsec.lc.is.bean;

import java.io.Serializable;

public class ServiceView implements Serializable {
private static final long serialVersionUID = - 2909733442648785569L ;
private ServiceId id;
public ServiceView() ... {
super ();
}
public ServiceId getId() ... {
return id;
}
public void setId(ServiceId id) ... {
this .id = id;
}
}
...

3.映射文件


<? 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 >
< class name ="com.txsec.lc.is.bean.ServiceView" table ="vwSPService" >
< composite-id name ="id" class ="com.txsec.lc.is.bean.ServiceId" >
< key-property name ="spId" type ="string" >
< column name ="SPID" />
</ key-property >
< key-property name ="spKey" type ="string" >
< column name ="SPKey" />
</ key-property >
< key-property name ="serviceId" type ="string" >
< column name ="serviceID" />
</ key-property >
< key-property name ="serviceName" type ="string" >
< column name ="serviceName" />
</ key-property >
< key-property name ="serviceItemId" type ="string" >
< column name ="serviceItemID" />
</ key-property >
< key-property name ="itemName" type ="string" >
< column name ="itemName" />
</ key-property >
</ composite-id >
</ class >
</ hibernate-mapping >

ok,用HQL进行查询时,就可以这样:
session.createQuery("from ServiceView sv where sv.id.serviceId = '100001'").list();

查询返回的是ServiceView对象或集合,要得到视图中字段的值,只需要调用ServiceView对象的getId()方法即可获得ServiceId对象,通过ServiceId对象的getXXX()方法,就可以访问到视图中的字段了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值