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自己做视图映射
hbm配置如下:
<hibernate-mapping package="huntersxp.db.pojo"> <class name="ViewMerInstPos"> <meta attribute="sync-DAO">false</meta> <subselect> select MER.DAYS_MERCHT_ID MER_ID,INST.SHOP_NM SHOP_NM,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 </subselect> <synchronize table="tbl_days_mercht_attr"/> <synchronize table="tbl_days_mercht_info"/> <synchronize table="tbl_days_mercht_pos_info"/> <composite-id> <key-property name="merId" column="MER_ID" type="java.lang.String" length="8" /> <key-property name="shopNm" column="SHOP_NM" type="java.lang.String" length="40" /> <key-property name="posId" column="POS_ID" type="java.lang.String" length="40" /> </composite-id> </class> </hibernate-mapping>
其中synchronize表示当表的数据发生变化的时候,视图的数据也会发生变化。
@Entity @Table(name = "test_summary") @Subselect("SELECT i.name AS itemName, MAX(b.amount) AS amountMax, COUNT(*) AS itemCount " + "FROM test_item i " + "INNER JOIN test_bid b ON i.item_id = b.id " + "GROUP BY i.name") @Synchronize( { "test_item", "test_bid" }) // tables impacted public class Summary implements Serializable { private static final long serialVersionUID = 3647575276389635849L; @Id @Column(name = "itemName") private String itemName; @Column(name = "amountMax") private double amountMax; @Column(name = "itemCount") private Integer itemCount; public Summary() { super(); } public Summary(String itemName, double amountMax, Integer itemCount) { super(); this.itemName = itemName; this.amountMax = amountMax; this.itemCount = itemCount; } public String getItemName() { return itemName; } public void setItemName(String itemName) { this.itemName = itemName; } public double getAmountMax() { return amountMax; } public void setAmountMax(double amountMax) { this.amountMax = amountMax; } public Integer getItemCount() { return itemCount; } public void setItemCount(Integer itemCount) { this.itemCount = itemCount; } }