hibernate映射视图



hibernate映射视图

因为一个报表需要的统计需要连接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>

 

结果居然成功执行数据库查询

 

执行数据库查询的语句是:

Session session = getHibernateTemplate().getSessionFactory().openSession();

List<?> treeArray = session.createSQLQuery(“select * from Tree”).list();

session.close();

return treeArray;