1.数据库已经建立视图,hibernate只是把视图当作普通的表来映射。
视图VIEW_MER_INST_POS:
select MER.DAYS_MERCHT_ID MER_ID,
       INST.DAYS_MERCHT_ID INST_ID,
       POS.POS_ID POS_ID
from tbl_days_mercht_attr MER,
     tbl_days_mercht_info INST,
     tbl_days_mercht_pos_info POS
where MER.days_mercht_id = INST.up_days_mercht_id
and INST.days_mercht_id = POS.days_mercht_id

hbm.xml配置
<class
    name="db.po.ViewMerInstPos"
    table="VIEW_MER_INST_POS"
>

    <composite-id>
            <key-property
            name="merId"
            column="MER_ID"
            type="java.lang.String"
            length="8"
        />
        <key-property
            name="instId"
            column="INST_ID"
            type="java.lang.String"
            length="8"
        />
        <key-property
            name="posId"
            column="POS_ID"
            type="java.lang.String"
            length="8"
        />
</class>
</hibernate-mapping>

2.数据库没有视图,用hibernate自己做视图映射

   hibernate还允许把只读的实体映射到一个数据库的子查询中。当你想用视图代替一张基本表的时候,这是有用的。

2.1运用标签

    <subselect> </subselect>


2.2 举例

    数据库存在学生基本信息表,现在想建立一个视图来统计每个年龄段的学生人数,并用一个实体类的进行映射。

 

(1)学生信息表的的映射文件(Student.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">
<hibernate-mapping package="com.zds.domain">
    <class name="Student" table="student" >
        <id name="id" column="student_id">
            <generator class="native"/> 
        </id>
        <property name="name"/>
        <property name="age"/>
        <property name="birthday"/>
        <property name="grade"/>
    </class>
</hibernate-mapping>
 


(2)学生统计信息配置文件(StudentStatic.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">
<hibernate-mapping package="com.zds.domain">
    <class  name="StudentStatic" entity-name="studentStatic">    
   <subselect>
      select count(student.student_id) as student_num, student.age as student_age
      from student as student
      group by age   
     </subselect>
     <synchronize table="student"/>      
     <composite-id>
            <key-property name="age" column="student_age" type="int" /> 
     </composite-id>
     <property name="student_num" column="student_num" type="int"/>
    </class>
</hibernate-mapping>

【其中synchronize表示当表的数据发生变化的时候,视图的数据也会发生变化。】


(3)学生统计信息实体类(StudentStatic.java)定义如下:

package com.zds.domain;

import java.io.Serializable;

public class StudentStatic implements Serializable{
 private int age;
 private int student_num;
 
 public int getStudent_num() {
  return student_num;
 }
 public void setStudent_num(int student_num) {
  this.student_num = student_num;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
 
}

现在查询视图,打印出学生统计信息:

List<StudentStatic> studentStaticData = new ArrayList<StudentStatic>();
  Session session = null;
  Transaction tx = null;
  session = HibernateUtil.getSession();
  tx = session.beginTransaction();
  Query query = session.createQuery("from studentStatic");
  studentStaticData = (List<StudentStatic>) query.list();
  tx.commit();
  for(StudentStatic studentStatic:studentStaticData)
  {
      System.out.println("年龄:  "+studentStatic.getAge()+"  

       人数:"+studentStatic.getStudent_num());
  }

posted on 2012-04-29 00:13  星^_^風  阅读(558)  评论(0编辑  收藏  举报