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语句要注意的问题的更多相关文章

  1. SQL查询每个表的字段数量

    --SQL查询每个表的字段数量select b.[name], count(*) As AllCount,ISNULL(ISNULL(sum(case when isnullable=0 then 1 ...

  2. SQL 查询横表变竖表

    SQL 查询横表变竖表   /*普通行列转换 假设有张学生成绩表(tb)如下:Name Subject Result张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 ...

  3. SQL查询一个表中类别字段中Max()最大值对应的记录

      SQL查询一个表中类别字段中Max()最大值对应的记录 SELECT A.id, A.name, A.version FROM   DOC A, (SELECT id, MAX(version)  ...

  4. ECSHOP后台SQL查询提示错误 this sql May contain UPDATE,DELETE,TRUNCATE,ALTER,DROP,FLUSH,INSERT

    一).首先说一下错误现象:市面上流行的绝大部分ECSHOP模板,安装的时候都需要执行一段或几段SQL语句来修改数据结构或者初始化一些数据.大多数ECSHOP管理员为了省事,都会通过 “ECSHOP后台 ...

  5. hibernate的基础学习--多表关联数据查询

    Hibernate共提供4种多表关联数据查询方式 OID数据查询+OGN数据查询方式 HQL数据查询方式 QBC数据查询方式 本地SQL查询方式(hibernate很少用) 1.OID数据查询+OGN ...

  6. MySQL千万级多表关联SQL语句调优

    本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化.   需要优化的查询:使用explain      出现了Using temporary:       ...

  7. MySQL百万级、千万级数据多表关联SQL语句调优

    本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级.千万级数据表关联查询第一页结果能在2秒内完成(真实业务告警系统优化结果).希望读者能够理解S ...

  8. 用SQL数据库做多表关联应怎样设计库结构20170527

    http://77857.blog.51cto.com/67857/143872/ 多表关联的话表之间必须得存在关系才行呢,这样建立外键约束就行了, 关系表中插入主表的主键做外键. 假设表1学生表st ...

  9. sql server多表关联update

    一般都是写的单表update语句,很少写多表关联的update,但是事实上,在SQL Server中,update的多表连接更新和select的多表连接查询在使用的方法上其实并没有多大区别. 直接上一 ...

随机推荐

  1. SnowNLP:一个处理中文文本的 Python 类库

    https://segmentfault.com/a/1190000000362372

  2. libevent源码分析(一)

    分析libevent的源代码,我的想法的是先分析各种结构体,struct event_base.struct event,然后是event_base_new函数.event_new函数.event_a ...

  3. Android first---放置在外存中的文件读取

    照样以登录案例举例: 第一步:界面绘制:跟之前写过的一个案例一样 第二步:逻辑代码 public class MainActivity extends Activity { //定义全局变量    p ...

  4. [问题2015S11] 复旦高等代数 II(14级)每周一题(第十二教学周)

    [问题2015S11]  证明: 任一复方阵都相似于一个复对称阵. 举例说明: 存在实方阵, 它不相似于实对称阵. 问题解答请在以下网址下载:http://pan.baidu.com/share/ho ...

  5. Python3基础 int(input())输入数字并产生一个int类型变量

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  6. Beaglebone Black–I2C 接 BMP280 获取当前温度

    我有两个含温度传感的模块,一个是AOSONG 奥松电子的 AM2320 温度湿度,另一个是九轴里面的 Bosch BMP280.由于 AM2320 用 I2C MODBUS,直接用 I2C Tools ...

  7. Java开发中经典的小实例-( 鸡蛋0.1元一个,鸭蛋3元一个,鹅蛋6元一个。求一百元买一百个蛋。)

    public class Test24 {    public static void main(String[] args) {        // 鸡蛋0.1元一个,鸭蛋3元一个,鹅蛋6元一个.求 ...

  8. RPM安装rabbitMQ

    系统使用的是centos 7 - minimal 建立用户和组: # groupadd rabbitmq # useradd rabbitmq -g rabbitmq 在安装rabbitMQ之前需要先 ...

  9. python_way ,day25 CMDB_models (数据库设计)

    from django.db import models from django.contrib.auth.models import User # Create your models here. ...

  10. 单据状态BE构建

    这节主要罗列出单据状态BE构建步骤1.创建单据状态BE实体项目,修改命名空间 2.如下图所示,分别设置实体枚举状态值 3.修改单据基本属性 构造后,至此单据状态BE构建完毕