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. Failed to create the part's controls [eclipse]

    查看源码 出现 Failed to create the part's controls 解决方法: eclipse.ini  中添加: -startup plugins/org.eclipse.eq ...

  2. GPIO相关知识

    参考资料: 1. 维基百科GPIO 2. GPIO博客资料(一) 3. MMIO和PMIO 知识点: ● GPIO是General-purpose input/output的缩写,是一个在集成电路上的 ...

  3. Android TextView自动换行文字排版参差不齐的原因

    今天项目没什么进展,公司后台出问题了.看了下刚刚学习Android时的笔记,发现TextView会自动换行,而且排版文字参差不齐.查了下资料,总结原因如下: 1.半角字符与全角字符混乱所致:这种情况一 ...

  4. [Oracle] SQL*Loader 详细使用教程(2)- 命令行参数

    sqlldr工具   SQL*Loader的客户端工具是sqlldr,在操作系统的命令行下输入sqlldr,后面不接任何参数,将显示帮助信息如下所示(所有命令行参数的简单描述及其默认值),所以你并不需 ...

  5. Delphi IDE 设置

    显示编译进度 Tools/Environment Options

  6. 转!!log4j基础

    log4j组件介绍 Log4j主要有三个组件: Logger:负责供客户端代码调用,执行debug(Object msg).info(Object msg).warn(Object msg).erro ...

  7. java实现httpclient 访问

    package com.test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; i ...

  8. 使用java自带线程池管理器demo

    1.程序入口:DabianTest package com.lbh.myThreadPool.present; import java.util.concurrent.ExecutorService; ...

  9. Linux 指令

    cat cdchmod chowncp cut 名称:cat使用权限:所有使用者使用方式:cat [-AbeEnstTuv] [--help] [--version] fileName说明:把档案串连 ...

  10. C++学习之:括号匹配与栈的使用

    #include <stack> using std::stack ; 变量定义: stack<T>  stackName ; 成员函数: 成员函数 功能 bool  empt ...