关于hibernate执行本地sql语句的若干问题 1.数据库中有两张表 表一 member Long id String name String age ... Long role_id 表二 role Long id String name ... 现有如下需求一 1.必须用hibernate执行SQL,而非HQL 2.对服务层最少要提供member.id,member.name,role.name 根据上面的需求,创建sql语句如下: sql:select m.id,m.name,r.id from member m,role r where r.id=m.role_id; 单独执行该sql,正确! 当将该sql用hibernate session提供的createSQLQuery(sql),获取到的结构并非正确的结果。 而是role.name的值与member.name的值一样。 针对这种问题hibernate官方文档也给出解释,可用如下方法获取 sql:list = select {entity_member.*},{entity_role.*} from member m,role r where r.id=m.role_id; session.createSQLQuery(sql).addEntity("entity_member",Member.class).addEntity ("entity_role",Role.class).list(); 这样获取的结果已经被hibernate封装成了对象集合。 如果要获取member.name 可以这样。 for(Member m:list){ System.out.print("member.name="+m.getName()); } 这种方法可以解决上面提到的需求一 这样虽然获取的内容比我们实际需要的内容多(我们只需要member.id,member.name,role.name,但是上 面的方式获取的是member的所有属性,但是不影响我们要获取的值,俗话说,宁愿多不愿缺) 如果将上面的需求一改变一下, 如下需求二 1.必须用hibernate执行SQL,而非HQL 2.获取所有Role表在member表中没有出现的Role并且member.name中包含“美”关键字。 根据上面的需求,创建sql语句如下: sql:select {entity_member.*},{entity_role.*} from role r left join (select m.* from member where m.name like '%杨%') member on r.id=member.role_id where ... ).addEntity ("entity_member",Member.class).addEntity("entity_role",Role.class).list(); 结果1:报错:Column '...' not found 结果2:运行速度极慢(大概要15秒钟~30秒钟) 什么原因,相比大家也猜出来了。 用如下方法可以解决带子查询的sql sql:select m.m_id,m.m_name,r.id from role r left join (select m.id as m_id,m_name from member where m.name like '%杨%') member on r.id=member.role_id where ... ).addEntity ("entity_member",Member.class).addEntity("entity_role",Role.class).list(); 也就是说在子查询中返回的列名给他重命名一下,避免与外层Role的列名重名。 总结:我一直都不喜欢用hibernate来作DAO操作。hibernate这种适合初学者用的东西还真的不是一般 人用的。建议大家也别用了。
Hibernate执行本地SQL的若干问题的探讨
猜你喜欢
转载自firethemax.iteye.com/blog/1460814
今日推荐
周排行