关于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框架来实现商品的分页显示。 首先,我们需要理解分页的基本概念。分页是将大量数据分割成若干个较小的部分,每个部分称为一页,用户可以逐页浏览,而不需要一次性加载所有数据。在...
Hibernate 5.0.12.Final是该系列的一个稳定版本,修复了一些已知问题,并引入了若干优化。这个版本的发布标志着Hibernate在性能、稳定性和兼容性上的进一步提升。 3. **配置与初始化** Hibernate的使用始于配置...
下面我们将深入探讨SQL分页加载数据的相关知识点。 1. **基本概念**:分页是将数据集分割成若干个固定大小的部分,每个部分称为一页。在网页或应用中,用户可以逐页浏览数据,而不是一次性加载所有内容,这样可以...
《Hibernate in Action》是一本深度探讨Java持久化框架Hibernate的专业书籍,中文版的发布使得更多的中国开发者能够深入了解和掌握这一强大的ORM(对象关系映射)工具。Hibernate是Java开发中的重要组成部分,它极大...
本文将深入探讨 Hibernate 3.6.0 Beta3 版本,揭示其在数据持久化领域的卓越特性与应用。 1. **Hibernate 概述** Hibernate 是一款开源的 ORM 解决方案,它允许开发者用 Java 对象来直接操作数据库,而无需编写...
在本篇文章中,我们将深入探讨Hibernate 3.5的关键特性、配置以及使用方法。 1. Hibernate 3.5概述: Hibernate 3.5在3.x系列中引入了若干改进和新功能,包括对JPA(Java Persistence API)的更好支持、性能优化...
在本项目中,我们主要探讨的是如何利用SpringMVC 3.0、Hibernate 3.0、jQuery和MySQL来构建一个完整的登录注册系统。这个系统不仅涵盖了后台的业务逻辑处理,还包括了前端的用户交互与数据验证。下面将分别详细介绍...
本文将详细探讨`Hibernate`中的分页实现及其相关知识点。 一、`Hibernate`分页基础 1. **什么是分页** 分页是一种数据展示策略,它将大量数据分成若干小块,每次只加载一部分,以减少内存占用,提高用户界面的...
Action类中的业务方法会调用由Spring管理的服务层bean,这些bean进一步通过SessionFactory获取Session,执行Hibernate的数据操作。 此外,配置文件如struts.xml、spring.xml和hibernate.cfg.xml会定义Action的映射...
- 本地动态SQL允许在PL/SQL中构建SQL字符串,然后通过`EXECUTE IMMEDIATE`执行。这种方式适用于需要根据变量条件构建SQL的情况。 在实际应用中,存储过程可以用于复杂的业务逻辑、数据处理、事务控制等。理解并...
下面我们将深入探讨Oracle PL/SQL存储过程的基础知识、基本语法以及一些常见问题。 **Oracle 存储过程基础知识** 1. **定义与创建**:存储过程由一系列的PL/SQL语句组成,包括变量声明、控制结构、SQL语句等,通过...
- 本地动态SQL:通过`EXECUTE IMMEDIATE`执行动态构建的SQL语句,适用于简单的SQL更改。 - 使用游标动态执行复杂查询:在存储过程中动态生成包含`OPEN/FETCH/CLOSE`的游标操作,处理多行返回结果。 掌握以上知识...
5. **执行查询并处理结果**:使用Java的JDBC或者ORM框架(如MyBatis、Hibernate)执行SQL,获取到当前页的数据。同时,不要忘记获取总记录数,以便在前端展示分页导航。 6. **构建分页对象**:将查询结果和分页信息...
9. **最佳实践与安全性**:探讨Struts 1.2应用的安全问题,如防止SQL注入、XSS攻击等,以及相应的防范措施。 10. **性能优化**:学习如何通过缓存机制、减少HTTP请求、优化数据库查询等方式提高Struts 1.2应用的...
3. **执行查询**:使用JDBC或ORM框架(如Hibernate、MyBatis)执行SQL,获取分页数据。 4. **返回结果**:将查询结果转换为JSON或其他格式,通过HTTP响应返回给前端。 5. **前端渲染**:前端接收到数据后,进行渲染...
在这样的技术栈下实现分页,我们可以利用Spring的JdbcTemplate或者MyBatis等持久层工具来执行SQL查询,获取每页的数据。同时,Struts或Spring MVC负责处理用户的请求,根据用户的选择(如当前页码、每页数量等)动态...
本教程将深入探讨如何在JAVA中实现高效的数据分页,这对于初学者来说是必备的知识点。 首先,我们要理解数据分页的基本概念。数据分页是指将大量数据分割成若干小块(页),每次只加载一部分数据到用户界面,而不是...
接下来,我们将深入探讨其中涉及的三个关键框架:Spring、Hibernate和Struts。 **Spring框架** 是一个全面的企业级应用开发框架,它主要关注于 inversion of control (IoC) 和 aspect-oriented programming (AOP)。...
在Java中,通过JDBC执行SQL语句时可以利用这些特性实现分页。 2. ORM框架:如Hibernate、MyBatis等,提供了更高级的分页API。例如,Hibernate有Criteria API和HQL支持分页,MyBatis可以通过设置start和limit参数...
2. ORM框架分页:例如使用Hibernate、MyBatis等ORM框架时,它们提供了分页查询的方法,简化了SQL分页的操作。 3. 前端分页:在Web应用中,前端也可以实现分页,例如通过Ajax异步请求,每次只获取当前页的数据,这样...