最近在项目中采用hibernate执行sql查询的时候,发现一个问题,估计是hibernate的bug,用sql进行多表关联查询的时候,发现hibernate对sql语句的别名支持不是太好,在数据库中执行没有问题的sql语句,一放到程序中就会出错,让人很是郁闷,比如:
select pc.fd_id as fd_id, sc.fd_name as courseName,
tm.fd_name as trainName,tm.doc_creator_id as creator_id,
oe.fd_name as creator, oe1.fd_id as dept_id ,
oe1.fd_name as deptName ,oe2.fd_id as superOrg_id ,
oe2.fd_name as superOrg
from hrt_train_plan_course pc,
hrt_train_main tm ,
hrt_study_course sc,
sys_org_element oe,
sys_org_element oe1,
sys_org_element oe2
where pc.fd_train_main_id = tm.fd_id
and pc.fd_study_course_id =sc.fd_id
and tm.doc_creator_id = oe.fd_id
and tm.doc_dept_id = oe1.fd_id
and oe.fd_parentorgid = oe2.fd_id
sql语句在数据库中执行完全没问题,但是放到org.hibernate.Session.createSQLQuery(sql)中便会报错,fd_name 列找不到的异常,将所有的别名全部去掉,如下:
select pc.fd_id , sc.fd_name ,
tm.fd_name ,tm.doc_creator_id,
oe.fd_name , oe1.fd_id ,
oe1.fd_name ,oe2.fd_id ,
oe2.fd_name
from hrt_train_plan_course pc,
hrt_train_main tm ,
hrt_study_course sc,
sys_org_element oe,
sys_org_element oe1,
sys_org_element oe2
where pc.fd_train_main_id = tm.fd_id
and pc.fd_study_course_id =sc.fd_id
and tm.doc_creator_id = oe.fd_id
and tm.doc_dept_id = oe1.fd_id
and oe.fd_parentorgid = oe2.fd_id
执行该查询不报错,但是所查询出来的数据完全不是在数据库中查询出来的那样,查询出来的fd_name列的值全变成了第一个fd_name的值,即hrt_study_course表fd_name的值,其他表的fd_name值也变成了hrt_study_course表中的fd_name值,最后没办法了,只能采用jdbc查询,或者将第一个sql创建为视图再用hibernate的sql查询。有哪位大神遇到过类似问题并知道答案的,欢迎一起交流。
分享到:
相关推荐
这里的`{cat.*}`是Hibernate的别名语法,用于指定SQL查询中的表别名,并将其与Java实体类关联。 如果查询涉及到关联加载,比如加载子实体或集合,可以使用`addJoin()`方法: ```java List<Cat> cats = sess....
《Hibernate中的本地SQL查询SQLQuery》 在Java的持久化框架Hibernate中,有时我们需要使用原生的SQL查询来实现特定的数据库操作,这时就需要利用到SQLQuery接口。本篇文章将详细解析如何使用Hibernate的SQLQuery来...
本教程将深入探讨"day36-hibernate检索和优化 02-Hibernate检索方式:简单查询及别名查询"的主题,通过源码分析和实际工具的应用,来提升数据库查询的效率。 首先,我们了解Hibernate的检索方式。在Hibernate中,...
### Hibernate 查询语句 -- HQL #### 概述 Hibernate 是一个开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而简化了数据访问逻辑。在 Hibernate 中,执行查询操作的主要...
4. **别名查询** ```java Query query = session.createQuery("select o from Order o"); List<Order> list = query.list(); ``` 使用别名可以使查询语句更加简洁易读。 5. **条件查询** ```java Query ...
最后,为了防止数据的安全性问题,比如防止SQL注入,使用Hibernate的查询API可以有效避免这类风险,因为它们都是预编译的,可以自动转义特殊字符。 总结,使用Hibernate在查询条件中创建List集合是Java开发中常见的...
本文主要探讨Hibernate中的查询语言,包括面向对象的查询语言HQL,QueryBy Criteria (QBC),Query By Example (QBE),以及原生SQL的使用。 1. **大小写敏感性** HQL查询语句对Java类和属性名称的大小写敏感,而...
- 避免N+1查询问题,通过一次性加载关联数据或使用JOIN查询。 - 合理配置缓存策略,减少对数据库的直接访问。 以上就是关于“Hibernate数据查询”的主要知识点。通过深入理解和熟练运用这些概念,开发者能够更加...
`User as user`是给User类设置别名,方便后续引用,`select user.name`则指定了返回的字段,`where age = 25`则是查询条件。 3. **查询条件** 在HQL中,可以使用各种条件语句来限制查询结果。例如,使用`=`, `<>`,...
在Java的Hibernate框架中,使用SQL语句是一个常见的需求,特别是在处理特定的数据库操作或优化查询性能时。Hibernate,作为SSH(Spring、Struts、Hibernate)三大Web开发框架之一,提供了一种优雅的方式将对象关系...
在Hibernate中,HQL(Hibernate Query Language)是专为ORM设计的一种面向对象的查询语言,它允许开发者以类和对象的方式进行数据查询,而不是直接使用SQL。本资料主要涵盖了Hibernate HQL查询的基本概念、语法以及...
此外,Hibernate允许我们直接使用SQL表达式,如通过`Restrictions.sql()`方法实现,但需要注意的是,`{alias}`需要替换为查询实体的列别名。 ```java List<Cat> cats = sess.createCriteria(Cat.class) .add...
HQL是Hibernate提供的面向对象的查询语言,类似于SQL,但操作的对象是对象而非表。例如,要获取所有用户,可以使用以下HQL语句: ```java Query query = session.createQuery("from User"); List<User> users = ...
但是,这种方式需要预先知道实体的ID,对于别名查询,我们通常会使用`CriteriaBuilder`和`CriteriaQuery`来构造动态查询,并使用`Root`来指定别名,然后通过`ProjectionList`将查询结果映射到实体。 5. **实体工厂*...
Hibernate通过HQL(Hibernate Query Language)和Criteria API提供了一种面向对象的查询机制,使得开发者无需直接编写SQL,就能方便地进行数据查询。 在Hibernate配置文件中,通常会为每个实体类定义对应的映射,...
HQL 是 Hibernate 提供的一种面向对象的查询语言,它的语法类似于 SQL 但更加面向对象。HQL 支持对持久化对象的查询,并且可以处理复杂的对象图关系,如继承和多态性。 #### 三、HQL 查询基本步骤 使用 HQL 查询...
`<sql-query>`标签中的`return`元素指定了查询结果映射到的对象类型和别名,别名用于匹配SQL查询中的占位符。 【整合Spring配置】 当项目使用Spring和Hibernate整合时,需要在Spring的配置文件中,通过...
HQL(Hibernate Query Language)是 Hibernate 中的一种强大的查询语言,它看起来很像 SQL,但是不要被语法结构上的相似所迷惑,HQL 是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的...
在 Hibernate 中,Criteria 查询是一种非常实用且强大的查询方式,它允许开发人员以面向对象的方式构建复杂的查询语句,而无需编写 SQL 代码。 Criteria 查询接口位于 `org.hibernate.Criteria` 包下,它是基于 ...