hibernate 执行sql中用sql语句查询,为什么只能查询一条记录?

hibernate hql如何查询满足条件的第一条记录以前用sql时可以写上一个top 1 就能返回一个查询结果,可是好像hql里没有这个呀
现在的需求是必须写在hql语句里,不能使用setFirstResult等------解决方案--------------------我查了,网上也没有解决方案,用hql是解决不了的;
要么,你针对具体的数据库,写sql语句;
要么,得到查询结果的list后,再做处理。------解决方案--------------------经过本人上网查询,这是不可能实现的。
要么查询list,只取第一条;
要么写sql语句,用函数实现;------解决方案--------------------只能写个完整的SQL语句,HQL没有这个解决方案。------解决方案--------------------hibernate的 setFirstResult 和 setMaxResult 能够兼容一些数据库。 如果你用hql
你直接用你使用的数据库的分页关键字
mysql用limit oracle用rowcount
sqlserver 用 top
^_^ 如果您热爱技术、热爱编程,想与更多的朋友一起交流学习,欢迎加入本站官方QQ群: ^_^Hibernate使用sql语句查询结果_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Hibernate使用sql语句查询结果
上传于||文档简介
&&Hibernate使用sql语句查询结果
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
SQL中的n+1次select语句查询问题
  如果当SQL中select语句数目过多,就会影响数据库的性能,如果需要查询n个Customer对象,那么必须执行n+1次select查询语句,下文就将为您讲解这个n+1次select查询问题。
  在的缓存中存放的是相互关联的对象图。默认情况下,当Hibernate从数据库中加载Customer对象时,会同时加载所有关联的Order对象。以Customer和Order类为例,假定ORDERS表的CUSTOMER_ID外键允许为null,图1列出了CUSTOMERS表和ORDERS表中的记录。
  以下Session的find()方法用于到数据库中检索所有的Customer对象:
   customerLists=session.find("from Customer as c");
  运行以上find()方法时,Hibernate将先查询CUSTOMERS表中所有的记录,然后根据每条记录的ID,到ORDERS表中查询有参照关系的记录,Hibernate将依次执行以下select语句:
  select * from CUSTOMERS;
  select * from ORDERS where CUSTOMER_ID=1;
  select * from ORDERS where CUSTOMER_ID=2;
  select * from ORDERS where CUSTOMER_ID=3;
  select * from ORDERS where CUSTOMER_ID=4;
  您所在的位置:数据库 & & SQL中的n+1次select语句查询问题(2)
  SQL中的n+1次select语句查询问题(2)
   09:03 玩玩乐乐 博客园 字号:T | T
  select语句的数目太多,需要频繁的访问数据库,会影响检索性能。如果需要查询n个Customer对象,那么必须执行n+1次select查询语句。这就是经典的n+1次select查询问题。
  AD: WOT2014:用户标签系统与用户数据化运营培训专场
  通过以上5条select语句,Hibernate最后加载了4个Customer对象和5个Order对象,在内存中形成了一幅关联的对象图,参见图2。
  Hibernate在检索与Customer关联的Order对象时,使用了默认的立即检索策略。这种检索策略存在两大不足:
  (1) select语句的数目太多,需要频繁的访问数据库,会影响检索性能。如果需要查询n个Customer对象,那么必须执行n+1次select查询语句。这就是经典的n+1次select查询问题。这种检索策略没有利用SQL的连接查询功能,例如以上5条select语句完全可以通过以下1条select语句来完成:
  select * from CUSTOMERS left outer join ORDERS
  on CUSTOMERS.ID=ORDERS.CUSTOMER_ID
  以上select语句使用了SQL的左外连接查询功能,能够在select语句中查询出CUSTOMERS表的所有记录,以及匹配的ORDERS表的记录。
  (2)在应用逻辑只需要访问Customer对象,而不需要访问Order对象的场合,加载Order对象完全是多余的操作,这些多余的Order对象白白浪费了许多内存空间。
  为了解决以上问题,Hibernate提供了其他两种检索策略:延迟检索策略和迫切左外连接检索策略。延迟检索策略能避免多余加载应用程序不需要访问的关联对象,迫切左外连接检索策略则充分利用了SQL的外连接查询功能,能够减少select语句的数目。
[ 责任编辑:jj ]
去年,手机江湖里的竞争格局还是…
甲骨文的云战略已经完成第一阶段…
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注Chinabytehibernate查询sql语句,得出结果和直接查数据库不一样
我有两个表,一个客户表,一个用户表,客户表中有领用人和指派人和用户表外键关联,现在我想多表关联查询出客户的指派人和领用人。
直接在数据库中写sql语句:
select cliName,c.uName,editDate,b.uName
from crm_client o & left join crm_user b on o.belongUid = b.uId & left join crm_user c on o.pointUid = c.uId
where 1=1& Id = '7fbaa0001'
order by& o.cliId desc
查询出结果是:
而我用hibernate查询。
public List findColectionByConditionNoPageWithExcelBySql(String condition,
final Object[] params, Map&String, String& orderby,String selectCondition,String mainTable,String inner) {
String sql = & select &+selectCondition + & from & + mainTable +& o & + inner + & where 1=1 &;
String orderbyCondition = this.getOrderByCondition(orderby);
final String finalSql = sql + condition + orderbyC
@SuppressWarnings(&unchecked&)
List list = (List)this.getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query query = session.createSQLQuery(finalSql);
if(params!=null && params.length&0){
for(int i=0;i&params.i++){
query.setParameter(i, params[i]);
return query.list();
} 通过传参,最终拼出的sql语句是:
select cliName,c.uName,editDate,b.uName from crm_client o& left join crm_user b on o.belongUid = b.uId& left join crm_user c on o.pointUid = c.uId where 1=1& Id = ? order by& o.cliId desc
结果查询出来的c.uName和b.uName一样,即前面的指派人将后面的领用人指派,指派人为空,领用人也为空,
而真正的结果应该是这样
不知道为什么会这样。控制台打印出的sql语句,去数据库直接查询也是正确结果,可是运行出的结果就是前面那样。
Hibernate框架的问题,对于相同字段名的结果集,两者数据相同,且靠后的结果等于靠前的结果。
解决方式:给相同字段名添加别名
用一楼的方法,在hql查询分析器中检查了下,得到了想要的结果
解决了,用hql执行语句
select o.cliName,b.userName,c.userName from CrmClient o
left join o.belongUser b
left join o.pointUser c
hql查询和left join 没有on,关联主表对象的外键对象既可。
把你的HQL语句在HQL查询分析器中查询看看结果跟你用sql查询的结果一致吗?
--- 共有 2 条评论 ---
打开myeclipse database explorer 视图 在里面新建数据库连接 然后就可以执行hql查询了
hql查询分析器怎么查看,是在MyEclipse中吗?}

我要回帖

更多关于 hibernate 执行sql 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信