目前存在的问题:
1. 最初我希望将CmParent和CmChild中的记录全部set入一个包含双方数据属性的普通VO中, 结果失败.
2. Object[] 的length必然是和希望封装成POJO的对象个数是匹配的, 如果通过连接查询, 子表中无记录, 则被set为null.
3. 还是希望能通过HQL实现类似功能.
新建两个表:
sql 代码
-
- create table CM_PARENT
- (
- ID NUMBER not null,
- NAME VARCHAR2(20)
- );
- alter table CM_PARENT
- add constraint CPP primary key (ID);
-
-
- create table CM_CHILD
- (
- ID NUMBER not null,
- NAME VARCHAR2(20),
- PARENTID VARCHAR2(20)
- );
- alter table CM_CHILD
- add constraint CCP primary key (ID);
向其中插入测试数据:
sql 代码
- insert into CM_PARENT (ID, NAME) values (1, 'como');
- insert into CM_PARENT (ID, NAME) values (2, 'chenmeng');
- insert into CM_CHILD (ID, NAME, PARENTID) values (1, 'como son1', '1');
- insert into CM_CHILD (ID, NAME, PARENTID) values (2, 'como son2', '1');
执行左外连接查询:
sql 代码
- select * from cm_parent cp left outer join cm_child cc on cp.id = cc.parentid
将获得:
sql 代码
- ID NAME ID NAME PARENTID
-
- 1 como 1 como son1 1
- 1 como 2 como son2 1
- 2 chenmeng
但是在Hibernate中, 如果两个表未做级联,则采用HQL尝试连接查询时会报:
java 代码
- org.hibernate.hql.ast.QuerySyntaxException: Path expected for join!
但是经过试验, 这种情况可以通过Hibernate的SQLQuery折衷解决. 方法如下:
1.对这两个表建立POJO及HBM, 过程略.
2.在DAO中加入方法:
java 代码
- public List executeSQLFind(final String sql, final String[] alias, final Class[] clasz) throws DaoException {
- Session session = getHibernateTemplate().getSessionFactory().openSession();
- SQLQuery realQuery = session.createSQLQuery(sql);
- for(int i=0; i
- realQuery.addEntity(alias[i], clasz[i]);
- }
- List dataList = realQuery.list();
- return dataList;
-
- }
在Service层调用:
java 代码
- String sql = "select {cp.*}, {cc.*} from cm_parent cp left outer join cm_child cc on cp.id = cc.parentid";
- String[] alias = new String[]{"cp","cc"};
- Class[] clasz = new Class[]{CmParent.class, CmChild.class};
- List b = baseDao.executeSQLFind(sql, alias, clasz);
返回的b为一个元素类型为Object[]的List. 测试如下:
java 代码
- for (int i = 0; i < b.size(); i++) {
- Object[] o = (Object[]) b.get(i);
- logger.info("CmParent No.#" + i + " == " + ((CmParent)o[0]).getName());
- if(null != o[1]) {
- logger.info("CmChild No.#" + i + " == " + ((CmChild)o[1]).getName());
- } else {
- logger.info("CmChild No.#" + i + " == NULL");
- }
- }
其中的o[0]为封装好的CmParent, o[1]为封装好的CmChild. 如图:
分享到:
相关推荐
数据库结果为三表级联,三表之间依次都是多对一的关系;其中代码核心代码都附有详细的注释,供大家研讨学习; 其中包括:Select.js:主要实现功能的js;Util.js:工具js,封装一些ajax的请求方法以及创建ajax的方法...
21.5 利用Hibernate的版本控制来实现乐观锁 21.5.1 使用元素 21.5.2 使用元素 21.5.3 对游离对象进行版本检查 21.5.4 强制更新版本 21.6 实现乐观锁的其他方法 21.7 小结 21.8 思考题 第22章 管理...
21.5 利用Hibernate的版本控制来实现乐观锁 21.5.1 使用元素 21.5.2 使用元素 21.5.3 对游离对象进行版本检查 21.5.4 强制更新版本 21.6 实现乐观锁的其他方法 21.7 小结 21.8 思考题 第22章 管理...
21.5 利用Hibernate的版本控制来实现乐观锁 21.5.1 使用元素 21.5.2 使用元素 21.5.3 对游离对象进行版本检查 21.5.4 强制更新版本 21.6 实现乐观锁的其他方法 21.7 小结 21.8 思考题 第22章 管理...
21.5 利用Hibernate的版本控制来实现乐观锁 21.5.1 使用元素 21.5.2 使用元素 21.5.3 对游离对象进行版本检查 21.5.4 强制更新版本 21.6 实现乐观锁的其他方法 21.7 小结 21.8 思考题 第22章 管理...
[Hibernate]利用Hibernate进行一对多的级联操作-Web实例 [Java_MySQL_jar]-数据库连接支持包 [JavaMail]-收发邮件支持包 [Java_MySQL_jar]Java访问数据库需要的包 [Spring]基于Spring框架的Web应用演示(附带...
[Hibernate]利用Hibernate进行一对多的级联操作-Web实例 [Java_MySQL_jar]-数据库连接支持包 [JavaMail]-收发邮件支持包 [Java_MySQL_jar]Java访问数据库需要的包 [Spring]基于Spring框架的Web应用演示(附带cglib...
4.3.7 映射一对多双向自身关联关系 244 4.3.8 映射多对多单向关联关系 247 4.3.9 映射多对多双向关联关系 252 4.3.10 映射组成关系 256 4.3.11 映射继承关系 260 4.3.12 hibernate的集合映射 266 4.4 小结 270...
[Hibernate]利用Hibernate进行一对多的级联操作-Web实例 [Java_MySQL_jar]-数据库连接支持包 [JavaMail]-收发邮件支持包 [Java_MySQL_jar] Java访问数据库需要的包 [Spring]基于Spring框架的Web应用演示(附带cglib...
同时每个查询都可以针对batch、fetchSize、maxResult、缓存、级联操作类型等进行调整和开关,可以将性能调到最优。可在主流数据库之间任意切换 支持Oracle、MySQL、Postgres、MSSQL、GBase、SQLite、HSQL、Derby等...
《Java项目开发全程实录》这一本书从开发背景、需求分析、系统功能分析、数据库分析、数据库建模、网站开发和网站发布或者程序打包与运行,每一过程都进行了详细的介绍。 目 录 第1章 进销存管理系统(Swing+SQL ...
{3.3}String常量重利用}{70}{section.3.3} {3.4}正则表达式}{71}{section.3.4} {3.5}StringBuffer}{75}{section.3.5} {3.6}StringBuilder}{76}{section.3.6} {3.7}StringBuilder与StringBuffer的缺点}{76}{...