Hibernate原生SQL查询多表关联,SQL语句要注意的问题
Hibernate原生SQL查询多表关联,SQL语句要注意的问题
@for&ever 2009-9-4
系统环境:
MySQL5.1
Hibernate3.3
有如下的假定:
实体类 Question 和 Answer分别对应数据表 question 和answer。
并且表 question 和answer 的字段大部分都一样,字段数目也一样。
执行如下的操作:
1>
使用hibernate 使用原生SQL查询,
Query q = session.createSQLQuery(sql).addEntity(Question.class).addEntity(Answer.class);
createSQLQuery执行的sql是如下的语句:
select b.*, a.* from question b left join answer a on a.id = b.ansId
在如上的addEntity 实体Question 和 Answer之后,查询可以进行,但是bean的注值错误。
具体现象为,question和answer两个实体查询出来后,数据混乱。
这个现象在Hibernate的官方文档中Native SQL Query一章有描述和具体的解决办法。
2>
于是按着 Hibernate 文档,修改SQL语句如下:
select {b.*}, {a.*} from question {b} left join answer {a} on {a}.id = {b}.ansId
执行查询后,报错:
Hibernate: select {b.*}, {a.*} from question {b} left join answer {a} on {a}.id = {b}.ansId
2009-09-04 20:03:53,625 WARN [org.hibernate.util.JDBCExceptionReporter] - <SQL Error: 1064, SQLState: 42000>
2009-09-04 20:03:53,625 ERROR [org.hibernate.util.JDBCExceptionReporter] - <You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' from question left join answer on .id = .ansId' at line 1>
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.loader.Loader.doList(Loader.java:2231)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
3>
接着修改SQL语句为:
select {bbbb}.*, {aaaa}.* from question {bbbb} left join answer {aaaa} on {aaaa}.id={bbbb}.ansId
查询,报错如下:
2009-09-04 19:14:59,140 INFO [org.hibernate.type.IntegerType] - <could not read column value from result set: id10_0_; Column 'id10_0_' not found.>
2009-09-04 19:14:59,140 WARN [org.hibernate.util.JDBCExceptionReporter] - <SQL Error: 0, SQLState: S0022>
2009-09-04 19:14:59,140 ERROR [org.hibernate.util.JDBCExceptionReporter] - <Column 'id10_0_' not found.>
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
4>
最终修改为:
select {bbbb.*}, {aaaa.*} from question {bbbb} left join answer {aaaa} on {aaaa}.id={bbbb}.ansId
查询结果正常。
总结:
1、使用Hibernate 原生SQL查询,当多个表的关联时,或者返回多个表的字段时,最好要添加别名,并注意添加的别名的写法;
2、别名alias 的命名不要太短,如上面的例子, a --> aaaa , b --> bbbb ,查询就一切正常;
3、当多个表格关联使用原生SQL查询时,记得对每个要返回的实体 addEntity。
Hibernate原生SQL查询多表关联,SQL语句要注意的问题的更多相关文章
- SQL查询每个表的字段数量
--SQL查询每个表的字段数量select b.[name], count(*) As AllCount,ISNULL(ISNULL(sum(case when isnullable=0 then 1 ...
- SQL 查询横表变竖表
SQL 查询横表变竖表 /*普通行列转换 假设有张学生成绩表(tb)如下:Name Subject Result张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 ...
- SQL查询一个表中类别字段中Max()最大值对应的记录
SQL查询一个表中类别字段中Max()最大值对应的记录 SELECT A.id, A.name, A.version FROM DOC A, (SELECT id, MAX(version) ...
- ECSHOP后台SQL查询提示错误 this sql May contain UPDATE,DELETE,TRUNCATE,ALTER,DROP,FLUSH,INSERT
一).首先说一下错误现象:市面上流行的绝大部分ECSHOP模板,安装的时候都需要执行一段或几段SQL语句来修改数据结构或者初始化一些数据.大多数ECSHOP管理员为了省事,都会通过 “ECSHOP后台 ...
- hibernate的基础学习--多表关联数据查询
Hibernate共提供4种多表关联数据查询方式 OID数据查询+OGN数据查询方式 HQL数据查询方式 QBC数据查询方式 本地SQL查询方式(hibernate很少用) 1.OID数据查询+OGN ...
- MySQL千万级多表关联SQL语句调优
本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化. 需要优化的查询:使用explain 出现了Using temporary: ...
- MySQL百万级、千万级数据多表关联SQL语句调优
本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级.千万级数据表关联查询第一页结果能在2秒内完成(真实业务告警系统优化结果).希望读者能够理解S ...
- 用SQL数据库做多表关联应怎样设计库结构20170527
http://77857.blog.51cto.com/67857/143872/ 多表关联的话表之间必须得存在关系才行呢,这样建立外键约束就行了, 关系表中插入主表的主键做外键. 假设表1学生表st ...
- sql server多表关联update
一般都是写的单表update语句,很少写多表关联的update,但是事实上,在SQL Server中,update的多表连接更新和select的多表连接查询在使用的方法上其实并没有多大区别. 直接上一 ...
随机推荐
- android抽屉总结
android抽屉:1.DrawerLayout 在xml文件中要注意写全称:android.support.v4.widget.DrawerLayout <LinearLayout /> ...
- android录像增加时间记录(源码里修改)
需要做一个功能,录像和播放时都显示录时的时间,参考文章链接找不到了,不好意思,这里记录一下,防止下次找不到了.另一篇关于源码录像的流程请参考 http://www.verydemo.com/demo_ ...
- noi 9265 取数游戏
题目链接:http://noi.openjudge.cn/ch0206/9265/ 题意:从自然数1到N中不取相邻2数地取走任意个数,问方案数. 解法:f[i][1]表示在前i个数中选了第i个的方案数 ...
- 【iOS】Foundation框架 学习笔记
1.数组 OC数组不能存放nil值OC数组只能存放OC对象.不能存放非OC对象类型,比如int.struct.enum等 ====================================== ...
- jQuery 效果 —— 隐藏和显示
jQuery 效果 -- 隐藏和显示 1.隐藏和显示 (1)在jQuery中我们可以使用hide()和show()分别隐藏和显示HTML元素: //隐藏元素 $("button") ...
- 矩阵的QR分解
#include <cstdio> #include <cstdlib> #include <algorithm> #include <cmath> # ...
- Oracle简单的函数语言
函数:这里的函数相当于java中写好的一些方法,有名字,可以传递参数,实现某一项具体功能. 函数分为: 1.单行函数 1.字符函数 2.日期函数 3.数字函数 4.转换函数 2.分组函数(后面的章节再 ...
- HTML5/CSS3hack
以下兼容技术我只测试了IE8+ Media Query 媒体查询 <script src="respond.min.js"></script> respon ...
- Deep Learning 9_深度学习UFLDL教程:linear decoder_exercise(斯坦福大学深度学习教程)
前言 实验内容:Exercise:Learning color features with Sparse Autoencoders.即:利用线性解码器,从100000张8*8的RGB图像块中提取颜色特 ...
- php 对多维数组排序array_multisort
php 对多维数组排序array_multisort 排序顺序标志: SORT_ASC - 按照上升顺序排序 SORT_DESC - 按照下降顺序排序 排序类型标志: SORT_REGULAR - 将 ...