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. 解决PowerDesigner 生成Sql2005-2012 找不到sysproperties表的问题

    造成此问题的原因是由于Sql 2005 删除了系统表 sysproperties 而改用 sys.extended_properties 表所致 ,微软的目的不再去猜测网上有二种解决方式 但不符合本人 ...

  2. oracle 金额格式化

    一般金额要显示成 XXX,XXX,XXX.XX的格式,可以这样做: to_char(column, 'FM999,999,999,990.00')

  3. JavaEE程序员必读图书大推荐

    下面是我根据多年的阅读和实践经验,给您推荐的一些图书: 第一部分: Java语言篇 1 <Java编程规范> 星级: 适合对象:初级,中级 介绍:作者James Gosling(Java之 ...

  4. css width="100" style ="width:100px" 区别

    1. width="100"是正确的,而 width="100px"是错误的, style = "width:100px"是正确的 2. s ...

  5. QT笔记之VS开发程序遇到的问题

    转载:http://www.cnblogs.com/li-peng/p/3644812.html 转载:http://www.cnblogs.com/csuftzzk/p/VS_Qt_Experien ...

  6. GZFramwork数据库层《四》单据主从表增删改查

    同GZFramwork数据库层<三>普通主从表增删改查 不同之处在于:实例 修改为: 直接上效果: 本系列项目源码下载地址:https://github.com/GarsonZhang/G ...

  7. 使用R进行倾向得分匹配

    pacman::p_load(knitr, wakefield, MatchIt, tableone, captioner)set.seed(1234)library(wakefield)df.pat ...

  8. java编写一个可以上下移动的小球:运行后,可以通过上下左右键进行移动

    /* * 功能:加深对事件处理机制的理解 * 1.通过控制上下左右键,来控制一个小球的位置 */package com.test1;import java.awt.*;import javax.swi ...

  9. 为ssh增加选项

    在使用ssh的时候,可以看到ssh有很多功能,什么-o , -e等等.如下图 需求,想要给ssh增加一个参数的功能.比如说我现在的需求就是执行ssh的时候可以增加一个选项,给我每次ssh的操作搭一个标 ...

  10. 忙了好一阵,今天随便写篇关于canvas的小东西

    前几天在朋友圈发了几条3D demo视频,其中就有3D空间组成各种图形.如上! 那么这些图形的每个mesh的坐标可不是手动去写,如果你愿意我当然不拦着!所以今天这篇就来介绍如何获得这些图形的坐标数据. ...