关于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语句
NULL 博文链接:https://ynp.iteye.com/blog/2007053
Hibernate+本地SQL查询SQLQuery宣贯.pdf
hibernate将本地SQL查询结果封装成对象。如进行复杂的统计等本地sql语句查询后,直接放到对象里了,而不会再使用Object进行强转
使用本地sql语句查询后,无需再使用Object对查询结果进行强制转换,而是直接将查询结果放到实体Bean里了。 PS: 其实只有一版,这里只所以叫最终版是因为该附件我上传了好几天传不上去,到最后报告说‘资源已经存在...
hibernate实现动态SQL查询,通过XML配置SQL,FREEMARKER 解析,生成要执行的SQL
hibernate执行sql文件中的sql并返回相应结果类似Mybatis功能
hibernate将本地SQL查询结果封装成对象(最终).zip
Hibernate+本地SQL查询SQLQuery.pdf
Struts 1.1、Hibernate 3.0和SQL Server 2005数据库驱动包
一个基于Hibernate 和 SQLServer 数据库的分页示例,所有文件和数据库备份都在,只是速度不怎么快,如果加上自动生成下拉框,速度就更慢了,单表、10008条测试数据,如果哪位大侠改进了查询速度望告之:vni2007@163....
使用Hibernate编写通用数据库操作代码
hibernate中使用sql 而不是hql语句
hibernate3连接sql server的例子,可以看看,这个例子测试运行过
模仿Hibernate生产SQL语句,使用Java反射
从Hibernate中提取的SQL格式化功能,去除了没用的功能,没有第三方jar包
在企业做项目时如果用了hibernate会有个头疼问题,就是如何让输出sql方便查看,因为出了问题时,要去查错时sql日志会给我们很大帮助,但hibernate通过配p6spy输出很乱,且只能输了到spy.log中,很不好查看,这里是我...
集成spring,hibernate,并且自写了一个sql的解析器,只有controller和service层,非常方便
前几天一直在搞spring+hibernate执行存储过程的技术,在网上查了很多资料没有一个是完全的能执行的,代码简单但,几天时间比较辛苦,所以要分多了点。由于包都太大,所以删掉啦!
Hibernate对原生SQL查询的支持和控制是通过SQLQuery接口实现的。通过Session接口,我们能够很方便的创建一个SQLQuery(SQLQuery是一个接口,在Hibernate4.2.2之前,默认返回的是SQLQuery的实现类——SQLQueryImpl对象...