`
mengz
  • 浏览: 79279 次
社区版块
存档分类
最新评论

利用Hibernate对未做级联关系的表进行连接查询

阅读更多

目前存在的问题:

1. 最初我希望将CmParent和CmChild中的记录全部set入一个包含双方数据属性的普通VO中, 结果失败.
2. Object[] 的length必然是和希望封装成POJO的对象个数是匹配的, 如果通过连接查询, 子表中无记录, 则被set为null.
3. 还是希望能通过HQL实现类似功能.

新建两个表:

sql 代码
  1. -- Create table CM_PARENT   
  2. create table CM_PARENT   
  3. (   
  4.   ID   NUMBER not null,   
  5.   NAME VARCHAR2(20)   
  6. );   
  7. alter table CM_PARENT   
  8.   add constraint CPP primary key (ID);   
  9.   
  10. -- Create table CM_CHILD   
  11. create table CM_CHILD   
  12. (   
  13.   ID       NUMBER not null,   
  14.   NAME     VARCHAR2(20),   
  15.   PARENTID VARCHAR2(20)   
  16. );   
  17. alter table CM_CHILD   
  18.   add constraint CCP primary key (ID);  

向其中插入测试数据:

sql 代码
  1. insert into CM_PARENT (ID, NAMEvalues (1, 'como');   
  2. insert into CM_PARENT (ID, NAMEvalues (2, 'chenmeng');   
  3. insert into CM_CHILD (ID, NAME, PARENTID) values (1, 'como son1', '1');   
  4. insert into CM_CHILD (ID, NAME, PARENTID) values (2, 'como son2', '1');  

执行左外连接查询:

sql 代码
  1. select * from cm_parent cp left outer join cm_child cc on cp.id = cc.parentid  

将获得:

sql 代码
  1. ID NAME                         ID NAME                 PARENTID   
  2. -- -------------------- ---------- -------------------- --------------------   
  3.  1 como                          1 como son1            1   
  4.  1 como                          2 como son2            1   
  5.  2 chenmeng                                               

但是在Hibernate中, 如果两个表未做级联,则采用HQL尝试连接查询时会报:

java 代码
  1. org.hibernate.hql.ast.QuerySyntaxException: Path expected for join!  

但是经过试验, 这种情况可以通过Hibernate的SQLQuery折衷解决. 方法如下:

1.对这两个表建立POJO及HBM, 过程略.

2.在DAO中加入方法:

java 代码
  1. public List executeSQLFind(final String sql, final String[] alias, final Class[] clasz) throws DaoException {   
  2.         Session session = getHibernateTemplate().getSessionFactory().openSession();   
  3.         SQLQuery realQuery = session.createSQLQuery(sql);   
  4.         for(int i=0; i
  5.             realQuery.addEntity(alias[i], clasz[i]);   
  6.         }   
  7.         List dataList = realQuery.list();   
  8.         return dataList;   
  9.            
  10.     }  

 在Service层调用:

java 代码
  1. String sql = "select {cp.*}, {cc.*} from cm_parent cp left outer join cm_child cc on cp.id = cc.parentid";
  2. String[] alias = new String[]{"cp","cc"};   
  3. Class[] clasz = new Class[]{CmParent.class, CmChild.class};   
  4. List b = baseDao.executeSQLFind(sql, alias, clasz);  

返回的b为一个元素类型为Object[]的List. 测试如下:

java 代码
  1. for (int i = 0; i < b.size(); i++) {   
  2.     Object[] o = (Object[]) b.get(i);   
  3.     logger.info("CmParent No.#" + i + " == " + ((CmParent)o[0]).getName());   
  4.     if(null != o[1]) {   
  5.         logger.info("CmChild No.#" + i + " == " + ((CmChild)o[1]).getName());   
  6.     } else {   
  7.         logger.info("CmChild No.#" + i + " == NULL");   
  8.     }   
  9. }  

其中的o[0]为封装好的CmParent, o[1]为封装好的CmChild. 如图:

 Object[] 对象内容

分享到:
评论
1 楼 hooklee2000 2007-05-23  
very good!

相关推荐

    Hibernate的缓存级联查询

    HQL(Hibernate Query Language)是Hibernate提供的面向对象的查询语言,它支持多种连接查询类型,如内连接、迫切内连接、隐式内连接、左外连接、迫切左外连接、右外连接和交叉连接,提供了与SQL类似的查询功能。...

    用hibernate做的省市县三级级联,

    在本项目中,开发者利用了Hibernate这一强大的对象关系映射(ORM)框架来实现这个功能,并结合了Ajax进行局部页面更新,使得用户在选择时无需刷新整个页面,提升了交互性。 首先,我们需要理解Hibernate的核心概念...

    hibernate 级联(cascade和inverse)一对多

    一、Hibernate级联(Cascade) 级联操作允许我们将对一个实体的更改自动应用到与之关联的其他实体。在一对多关系中,如果一个实体(父实体)与多个实体(子实体)关联,设置级联属性可以确保在处理父实体时,子实体...

    Struts2+Hibernate写的下拉菜单级联两级分类

    总的来说,实现“Struts2+Hibernate写的下拉菜单级联两级分类”需要对这两个框架有深入的理解,同时也涉及到前端交互和数据库操作。这是一个典型的前后端协作的例子,展示了如何利用Java Web技术解决实际问题。在...

    hibernate 自连接 emp例子

    通过这种方式,我们可以利用Hibernate的强大功能处理复杂的数据库操作,例如查询员工的上下级关系。在实际应用中,这样的查询可以帮助我们构建组织结构图或者进行权限管理等业务逻辑。 总结来说,Hibernate的自连接...

    三级联动的实例+struts2+hibernate3

    Hibernate3通过XML配置文件或注解将Java类与数据库表进行映射,从而避免了繁琐的SQL编写,提高了开发效率。 实现三级联动的关键在于,我们需要在用户选择第一个下拉框后动态加载第二个下拉框的数据,然后在第二个...

    SSH(Spring+Struts2+Hibernate)登录与AJAX级联

    SSH(Spring、Struts2、...总结,这个SSH登录与AJAX级联的demo展示了如何利用SSH框架进行后端业务处理,结合AJAX提供流畅的前端交互。开发者可以通过这个项目学习到如何整合这些技术,提高开发效率和代码质量。

    ajax+ssh实现省份城市级联查询

    在省份城市级联查询中,Hibernate可以用来映射省市区的数据库表结构,通过SQL查询获取数据,并将其转换为Java对象供前端展示。例如,当用户选择省份时,后台可以使用Hibernate的Criteria或HQL查询语句来获取该省份的...

    SSH+级联菜单应用案例

    在级联菜单应用中,它用于将菜单数据模型与数据库表进行映射,提供CRUD(创建、读取、更新、删除)操作。级联菜单的数据通常存储在多层关联的表结构中,Hibernate可以通过HQL(Hibernate Query Language)或 ...

    spring jpa操作数据库 级联数据 hibernate

    了解并熟练掌握这些知识点,将有助于开发人员更高效地构建基于Spring JPA的数据库驱动应用,同时也能更好地理解和利用Hibernate的高级特性。通过实践这些教程和示例,可以加深对数据库操作和级联关系的理解,提高...

    级联显示(树形,下拉列表)

    在IT行业中,级联显示是一种常见的用户界面设计技术,它允许用户从多个相关选项中进行选择,这些选项之间存在依赖关系。在这个场景中,我们关注的是如何在Java中结合Struts和Hibernate框架来实现级联的树形和下拉...

    hibernate基于主外键的一对多/多对一关联

    在实际开发中,处理一对多/多对一关联时,我们通常会利用Hibernate的懒加载或立即加载策略。懒加载意味着只有在真正需要关联数据时,Hibernate才会去数据库查询;而立即加载则会在获取主对象时一起加载关联的对象。...

    使用Hibernate连接MySql的入门小程序

    **使用Hibernate连接MySQL的入门小程序** ...随着对Hibernate的深入理解,你可以利用它的高级特性,如缓存、级联操作、多表关联等,进一步提高开发效率和代码质量。祝你在学习Hibernate的道路上一切顺利!

    Struts_Hibernate_Dwr框架整合省份菜单级联

    Hibernate则是一个对象关系映射(ORM)框架,它简化了数据库操作,将Java对象与数据库表进行映射,使得开发者可以以面向对象的方式处理数据。在省份菜单级联的场景中,Hibernate将用于管理省份和城市的数据,包括...

    城市级联之三级联动

    数据库结果为三表级联,三表之间依次都是多对一的关系;其中代码核心代码都附有详细的注释,供大家研讨学习; 其中包括:Select.js:主要实现功能的js;Util.js:工具js,封装一些ajax的请求方法以及创建ajax的方法...

    Hibernate多对多关系

    - **缓存策略**:利用Hibernate的二级缓存可以提高查询效率,特别是对于经常访问的关联数据。 7. **注意问题**: - **关联表的主键**:在自动生成关联表时,需确保两个外键组合成的主键具有唯一性,避免数据冗余...

    hibernate3.6.10final官方文档

    Hibernate作为一款强大的对象关系映射(ORM)工具,能够帮助开发者将Java类与数据库表进行无缝对接,极大地简化了数据访问层的编程工作。 一、Hibernate概述 Hibernate是一个开源的Java ORM框架,它允许开发者使用...

    Hibernate多对一映射(注解版)

    在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它允许开发者将数据库操作与Java对象模型紧密地结合起来,从而简化...在实践中,不断优化和调整,才能更好地利用Hibernate提升开发效率和应用性能。

    hibernate5.2.9

    1. **对象关系映射(ORM)**:Hibernate的核心功能是将Java类与数据库表之间建立映射关系,使得可以通过对象的方式来操作数据库,降低了数据访问层的复杂性。 2. **配置文件**:在hibernate-release-5.2.9.Final中...

    harnessing_hibernate3 源码和书

    这本书深入剖析了Hibernate 3的内部机制,提供了丰富的实例和代码,帮助开发者掌握如何有效地利用Hibernate进行对象关系映射(ORM)和数据库操作。源码和书籍的结合使得学习更加直观和深入。 Hibernate是一个流行的...

Global site tag (gtag.js) - Google Analytics