虽然Hibernate提供的HQL可以实现多表联合查询,但是我们一般都是将多表查询直接创建为一个视图,直接查询视图就可以了。那么Hibernate怎样映射视图呢?
在网上找了一篇较实用的文章现分享给大家。
文章链接:http://blog.youkuaiyun.com/kingkuang2006/article/details/6981974
由于项目(ssh)有需求根据关键字查询位于同一服务器下不同数据库的2张表t_navi和t_news,由于涉及到分页查询,故不想自己手动去写sql语句来实现跨表查询,不但麻烦而且容易写错,所以想用Hibernate视图来完成该功能,因此上网查看了一些资料,并最终完美解决,故将解决方案记录如下:
一、首先创建一个跨数据库视图
mysql>create view db_cms.search_view as(select * from db_cms.t_navi)union all(select* from db_news.t_news);
注:由于t_navi 和 t_news两张表字段数量和意义完全相同,所以这里使用了union all;
二、生成POJO类和Hibernate配置文件
如果怕自己容易写错,可以使用Myeclipse通过视图反向生成POJO类和**.hbm.xml,如果通过Myeclipse生成的话,将生成如下几个文件:
SearchView.java SearchViewId.java SearchView.hbm.xml
1、SearchView.java
- publicclassSearchViewimplementsSerializable{
- /**
- *
- */
- privatestaticfinallongserialVersionUID=-1372050399492830775L;
- privateSearchViewIdid;
- publicSearchViewIdgetId(){
- returnid;
- }
- publicvoidsetId(SearchViewIdid){
- this.id=id;
- }
- }
2、SearchViewId.java
- publicclassSearchViewIdimplementsSerializable{
- privatestaticfinallongserialVersionUID=-2960868353091674237L;
- privateIntegerid;
- privateStringnaviTitle;
- privateBooleannaviShow=true;
- privateBooleantreeShow=true;
- privateBooleanjumpHref=false;
- privateBooleanwindowOpen=false;
- privateIntegerauditStatus;
- privateDatecreateDate;
- privateDateupdateDate;
- privateStringcontent;
- privateStringaccessPath;
- privateStringjumpHrefUrl;
- publicIntegergetId(){
- returnid;
- }
- publicvoidsetId(Integerid){
- this.id=id;
- }
- publicStringgetNaviTitle(){
- returnnaviTitle;
- }
- publicvoidsetNaviTitle(StringnaviTitle){
- this.naviTitle=naviTitle;
- }
- publicBooleangetNaviShow(){
- returnnaviShow;
- }
- publicvoidsetNaviShow(BooleannaviShow){
- this.naviShow=naviShow;
- }
- publicBooleangetTreeShow(){
- returntreeShow;
- }
- publicvoidsetTreeShow(BooleantreeShow){
- this.treeShow=treeShow;
- }
- publicBooleangetJumpHref(){
- returnjumpHref;
- }
- publicvoidsetJumpHref(BooleanjumpHref){
- this.jumpHref=jumpHref;
- }
- publicBooleangetWindowOpen(){
- returnwindowOpen;
- }
- publicvoidsetWindowOpen(BooleanwindowOpen){
- this.windowOpen=windowOpen;
- }
- publicIntegergetAuditStatus(){
- returnauditStatus;
- }
- publicvoidsetAuditStatus(IntegerauditStatus){
- this.auditStatus=auditStatus;
- }
- publicDategetCreateDate(){
- returncreateDate;
- }
- publicvoidsetCreateDate(DatecreateDate){
- this.createDate=createDate;
- }
- publicDategetUpdateDate(){
- returnupdateDate;
- }
- publicvoidsetUpdateDate(DateupdateDate){
- this.updateDate=updateDate;
- }
- publicStringgetContent(){
- returncontent;
- }
- publicvoidsetContent(Stringcontent){
- this.content=content;
- }
- publicStringgetAccessPath(){
- returnaccessPath;
- }
- publicvoidsetAccessPath(StringaccessPath){
- this.accessPath=accessPath;
- }
- publicStringgetJumpHrefUrl(){
- returnjumpHrefUrl;
- }
- publicvoidsetJumpHrefUrl(StringjumpHrefUrl){
- this.jumpHrefUrl=jumpHrefUrl;
- }
- }
3、SearchView.hbm.xml
- <?xmlversion="1.0"encoding="UTF-8"?>
- <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mappingpackage="org.bgi.cms.domain">
- <classname="SearchView"table="search_view">
- <spanstyle="color:#ff0000;"><composite-idname="id"class="SearchViewId">
- </span><key-propertyname="id"type="integer">
- <columnname="id"/>
- </key-property>
- <key-propertyname="naviTitle"type="string">
- <columnname="navi_title"length="255"/>
- </key-property>
- <key-propertyname="naviShow"type="yes_no">
- <columnname="is_navi_show"/>
- </key-property>
- <key-propertyname="treeShow"type="yes_no">
- <columnname="is_tree_show"/>
- </key-property>
- <key-propertyname="jumpHref"type="yes_no">
- <columnname="is_jump_href"/>
- </key-property>
- <key-propertyname="windowOpen"type="yes_no">
- <columnname="is_window_open"/>
- </key-property>
- <key-propertyname="auditStatus"type="integer">
- <columnname="audit_status"/>
- </key-property>
- <key-propertyname="createDate"type="timestamp">
- <columnname="create_date"/>
- </key-property>
- <key-propertyname="updateDate"type="timestamp">
- <columnname="update_date"/>
- </key-property>
- <key-propertyname="content"type="text">
- <columnname="content"/>
- </key-property>
- <key-propertyname="jumpHrefUrl"type="string">
- <columnname="jump_href_url"length="255"/>
- </key-property>
- <key-propertyname="accessPath"type="string">
- <columnname="access_path"length="45"/>
- </key-property>
- <spanstyle="color:#ff0000;"></composite-id>
- </span></class>
- </hibernate-mapping>
注:由于视图是没有主键的,所以Myeclipse生成的hbm.xml配置文件会将所有字段放在一起当做联合主键,这样做有一个问题就是,一旦视图中某个字段为null的话,该条数据在做查询时是查不出来的,所以现在暂时还不能完全确定可以使用该配置文件(如果这些联合主键中的所有字段都是不能为空的话就没有问题,完全可以放心的使用工具生成的改配置文件),因为在我的项目中,视图中的content、jumpHrefUrl以及accessPath字段都是可以为空的,所以需要修改这3个文件,如下:
1、SearchView.java(红色的为修改的)
- publicclassSearchViewimplementsSerializable{
- /**
- *
- */
- privatestaticfinallongserialVersionUID=-1372050399492830775L;
- privateSearchViewIdid;
- <spanstyle="color:#ff0000;">privateStringcontent;
- privateStringaccessPath;
- privateStringjumpHrefUrl;
- </span>
- publicSearchViewIdgetId(){
- returnid;
- }
- publicvoidsetId(SearchViewIdid){
- this.id=id;
- }
- <spanstyle="color:#ff0000;">publicStringgetContent(){
- returncontent;
- }
- publicvoidsetContent(Stringcontent){
- this.content=content;
- }
- publicStringgetAccessPath(){
- returnaccessPath;
- }
- publicvoidsetAccessPath(StringaccessPath){
- this.accessPath=accessPath;
- }
- publicStringgetJumpHrefUrl(){
- returnjumpHrefUrl;
- }
- publicvoidsetJumpHrefUrl(StringjumpHrefUrl){
- this.jumpHrefUrl=jumpHrefUrl;
- }
- </span>}
- publicclassSearchViewIdimplementsSerializable{
- privatestaticfinallongserialVersionUID=-2960868353091674237L;
- privateIntegerid;
- privateStringnaviTitle;
- privateBooleannaviShow=true;
- privateBooleantreeShow=true;
- privateBooleanjumpHref=false;
- privateBooleanwindowOpen=false;
- privateIntegerauditStatus;
- privateDatecreateDate;
- privateDateupdateDate;
- <spanstyle="color:#ff0000;">//privateStringcontent;
- //privateStringaccessPath;
- //privateStringjumpHrefUrl;
- </span>
- publicIntegergetId(){
- returnid;
- }
- publicvoidsetId(Integerid){
- this.id=id;
- }
- publicStringgetNaviTitle(){
- returnnaviTitle;
- }
- publicvoidsetNaviTitle(StringnaviTitle){
- this.naviTitle=naviTitle;
- }
- publicBooleangetNaviShow(){
- returnnaviShow;
- }
- publicvoidsetNaviShow(BooleannaviShow){
- this.naviShow=naviShow;
- }
- publicBooleangetTreeShow(){
- returntreeShow;
- }
- publicvoidsetTreeShow(BooleantreeShow){
- this.treeShow=treeShow;
- }
- publicBooleangetJumpHref(){
- returnjumpHref;
- }
- publicvoidsetJumpHref(BooleanjumpHref){
- this.jumpHref=jumpHref;
- }
- publicBooleangetWindowOpen(){
- returnwindowOpen;
- }
- publicvoidsetWindowOpen(BooleanwindowOpen){
- this.windowOpen=windowOpen;
- }
- publicIntegergetAuditStatus(){
- returnauditStatus;
- }
- publicvoidsetAuditStatus(IntegerauditStatus){
- this.auditStatus=auditStatus;
- }
- publicDategetCreateDate(){
- returncreateDate;
- }
- publicvoidsetCreateDate(DatecreateDate){
- this.createDate=createDate;
- }
- publicDategetUpdateDate(){
- returnupdateDate;
- }
- publicvoidsetUpdateDate(DateupdateDate){
- this.updateDate=updateDate;
- }
- <spanstyle="color:#ff0000;">//</span><spanstyle="color:#ff0000;">publicStringgetContent(){
- //returncontent;
- //}
- //
- //publicvoidsetContent(Stringcontent){
- //this.content=content;
- //}
- //
- //publicStringgetAccessPath(){
- //returnaccessPath;
- //}
- //
- //publicvoidsetAccessPath(StringaccessPath){
- //this.accessPath=accessPath;
- //}
- //
- //publicStringgetJumpHrefUrl(){
- //returnjumpHrefUrl;
- //}
- //
- //publicvoidsetJumpHrefUrl(StringjumpHrefUrl){
- //this.jumpHrefUrl=jumpHrefUrl;
- //}
- </span>}
- <?xmlversion="1.0"encoding="UTF-8"?>
- <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mappingpackage="org.bgi.cms.domain">
- <classname="SearchView"table="search_view">
- <composite-idname="id"class="SearchViewId">
- <key-propertyname="id"type="integer">
- <columnname="id"/>
- </key-property>
- <key-propertyname="naviTitle"type="string">
- <columnname="navi_title"length="255"/>
- </key-property>
- <key-propertyname="naviShow"type="yes_no">
- <columnname="is_navi_show"/>
- </key-property>
- <key-propertyname="treeShow"type="yes_no">
- <columnname="is_tree_show"/>
- </key-property>
- <key-propertyname="jumpHref"type="yes_no">
- <columnname="is_jump_href"/>
- </key-property>
- <key-propertyname="windowOpen"type="yes_no">
- <columnname="is_window_open"/>
- </key-property>
- <key-propertyname="auditStatus"type="integer">
- <columnname="audit_status"/>
- </key-property>
- <key-propertyname="createDate"type="timestamp">
- <columnname="create_date"/>
- </key-property>
- <key-propertyname="updateDate"type="timestamp">
- <columnname="update_date"/>
- </key-property>
- </composite-id>
- <spanstyle="color:#ff0000;"><propertyname="content"column="content"type="text"/>
- <propertyname="jumpHrefUrl"column="jump_href_url"type="string"length="255"/>
- <propertyname="accessPath"column="access_path"type="string"length="45"/>
- </span></class>
- </hibernate-mapping>