目前存在的问题:
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. 如图:
阅读(2250) | 评论(1) | 转发(0) |