`
fangang
  • 浏览: 866639 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
311c4c32-b171-3767-b974-d26acf661fb2
谈谈用例模型的那些事儿
浏览量:37998
767c50c5-189c-3525-a93f-5884d146ee78
一次迭代式开发的研究
浏览量:68384
03a3e133-6080-3bc8-a960-9d915ed9eabc
我们应当怎样做需求分析
浏览量:407841
753f3c56-c831-3add-ba41-b3b70d6d913f
重构,是这样干的
浏览量:86872
社区版块
存档分类
最新评论

现在我们在hibernate中还需要使用多表查询吗?

阅读更多

最近我和一朋友讨论如何在在spring+hibernate框架下设计通用的查询程序。设计通用的查询程序,对于单表查询比较容易,只要把要查询的值对象和查询条件作为条件传递给后台就可以执行查询了。而从结果集中取值也比较容易,因为结果集就是这个值对象的集合。但要是设计一个通用的多表查询程序就比较复杂了,涉及多个值对象、值对象的关联、查询条件的前缀、取值等等问题。我提出一个观点,现在的hibernate可以不需要多表查询,运用单表查询以及值对象的各种关系就可以完全实现所有多表查询的功能。

为什么这么说呢?比如我们需要获得一个部门及其下面的所有员工。过去我们需要将部门和员工这2个表进行关联进行多表查询,但现在我们只需要在设计部门值对象的时候为其增加一个一对多关联,然后通过单表查询部门表,在每个部门值对象的员工属性中就有其所有的员工了。再比如,如果我们需要在查询员工的时候显示各个员工所在部门的部门名称,现在我们也同样不需要多表查询了。只需要在员工值对象中建立员工到部门的多对一关系,在单表查询员工的时候,每个员工值对象中都有部门属性,对应的是部门值对象,包含了其所在部门的全部信息。

以上提供了运用单表查询以及值对象的各种关系替代多表查询最常见的2种情况,而hibernate还提供了一对一、多对多、3种继承关系,我认为可以含盖几乎所有需要使用多表查询的应用。所以我认为,hibernate发展到现在,我们可以几乎不需要使用多表查询。编写一个通用的单表查询程序就可以应付大多数使用hibernate的查询程序,除了复杂查询。hibernate不适用于复杂查询,不论是易用性、效率来看都不适合。

分享到:
评论
9 楼 fangang 2007-10-09  
misschun 写道
延迟加载 不是在 配置文件里 写的吗?  不就写死了吗? 我hibernate不是很好 ,不好意思.

看来你是应当好好看看书。写死是指在java程序中写死了,今后如果需要修改设置就需要修改程序,不利于维护,称为写死。在配置文件中设置延迟加载了,如果今后不需要延迟加载,仅仅只需要修改配置文件而不需要修改任何java程序,这就不是程序写死了。
8 楼 kaki 2007-10-09  
我是这样想的:

1、在写数据、更新/删除数据中Hibernate很实用,很方便。

2、在分析展示数据时还是拼写SQL来的方便。

7 楼 木头人 2007-10-09  
我选择创建视图
6 楼 misschun 2007-10-09  
延迟加载 不是在 配置文件里 写的吗?  不就写死了吗? 我hibernate不是很好 ,不好意思.
5 楼 fangang 2007-10-08  
vip01 写道
出报表的时候你怎么办
N表查询

出报表的时候,如果报表是简单查询,依然可以如我所说的进行单表查询。如果是复杂查询,就不要使用hibernate而改为jdbc也许更方便快捷。
问题是什么是简单查询。我在这里指的简单查询是那些仅仅是表间关联和数个条件组成的,不包含任何函数、求union以及多层子查询等复杂操作。
如我以上说的简单查询,即使出现数个表关联,并且从各个不同表中设置条件,hibernate的单表查询都是可以应付的。比如员工与部门形成多对一、与项目形成多对多、与住址形成一对一,同时员工与工作计划、工作计划与绩效考核、绩效考核与考核工资等多表形成链状关联,都可以通过员工进行单表查询。并且,我们可以通过“员工.工作计划.绩效考核.考核工资.考核工资ID=某个值”就可以对该员工表的查询进行条件限定。如果你采用了这种单表查询,我的示例也许可以提供给你一个通用查询的方案供你参考。http://fangang.iteye.com/blog/120768,你可以看看BasicDao中的query方法。
但是,如果报表的查询是以上提到的复杂查询的情况就不太方便使用单表查询了,不如直接使用jdbc。但这种情况在项目中往往只会在报表统计中出现,在整个项目中占的比重小。以上的讨论可以解决大部分查询的问题。
4 楼 fangang 2007-10-08  
misschun 写道
我有个疑问, 比如部门和该部门下的员工,设置了一对多的关系,但有的业务我不需要查询出该部门下的员工 而 有的业务需要查询出员工, 如果该部门有很多员工 在不需要查询员工的时候 也把员工加载出来 会不会 很浪费资源呢? 怎么样能解决这个问题?

misschun朋友似乎还不知道hibernate的延迟查询。hibernate在查询员工表的时候并不会马上加载部门信息,解决了不需要查询员工时的效率问题,而在你真正需要使用部门信息的时候才去加载,这被称为延迟查询。在hibernate2的时候,由于可能出现session关闭的问题,延迟查询并不成熟。hibernate3推出了OpenSessionInView,解决了该问题,因此hibernate3默认就是使用延迟查询。
3 楼 vip01 2007-10-08  
出报表的时候你怎么办
N表查询
2 楼 kaki 2007-10-08  
尽管hibernate提供了一对一、多对多、3种继承关系,但是习惯的更改的确很困难,拼SQL有些时候的确很方便,很灵活。
1 楼 misschun 2007-10-08  
我有个疑问, 比如部门和该部门下的员工,设置了一对多的关系,但有的业务我不需要查询出该部门下的员工 而 有的业务需要查询出员工, 如果该部门有很多员工 在不需要查询员工的时候 也把员工加载出来 会不会 很浪费资源呢? 怎么样能解决这个问题?

相关推荐

    hibernate多表联合查询

    在实际项目开发中,我们经常需要处理复杂的数据库查询,特别是涉及到多个表之间的关联查询。Hibernate作为一款流行的Java持久层框架,提供了一种非常便捷的方式来处理这些问题。本文将详细介绍如何利用Hibernate进行...

    Hibernate连表查询 Hibernate连表查询

    在实际开发过程中,我们经常会遇到需要从多个表中获取数据的情况,这时就需要用到连表查询。 #### 1. HBM 映射文件 在提供的内容中,出现了两个HBM映射文件:`TopProductsDeputy.hbm.xml` 和 `TopProducts.hbm.xml...

    Hibernate各种查询:联表查询 分页查询 位置参数查询(?) 占位符查询(冒号查询) 统计查询

    本篇文章将详细解析Hibernate中的几种主要查询方式,包括联表查询、分页查询、位置参数查询、占位符查询(冒号查询)以及统计查询,这些都是在实际开发中非常常见的需求。 首先,我们来看**联表查询**。在Hibernate...

    Hibernate 多表连接分页查询示范项目

    2. **定义关联**:在实体类中使用 @ManyToOne, @OneToOne, @OneToMany 或 @ManyToMany 等注解定义表之间的关联关系。 3. **创建 SessionFactory**:配置 Hibernate 的属性,如数据库连接信息,生成 SessionFactory ...

    hibernate 多表查询

    hibernate 多表查询 hibernate 多表不同于一般的sql嵌套查询,嵌套查询是不支持的,所以必须要配置好才能实现多表!只要配置好了,还是特别好用的

    hibernate 进行多表查询每个表中各取几个字段

    本篇文章将探讨如何在Hibernate中进行多表查询,并从每个表中选取特定的字段。 一、Hibernate的多表查询基础 在Hibernate中,多表查询通常涉及到关联关系的映射,包括一对一(OneToOne)、一对多(OneToMany)、多...

    hibernate代码优化基于配置的多表查询

    在Java的Web开发中,Hibernate是一个非常流行的ORM...通过以上这些策略,我们可以优化基于配置的多表查询,提升Hibernate在实际应用中的性能。在具体实践中,应结合项目需求和数据库设计灵活调整,以达到最佳效果。

    Hibernate_query查询数据表中的一个字段.

    在使用Hibernate进行查询前,首先需要进行基本的配置,包括创建hibernate.cfg.xml配置文件,设置数据库连接信息,以及实体类和表的映射文件(.hbm.xml)。 三、Entity类与表的映射 在Hibernate中,每一个数据库表都...

    day36 04-Hibernate检索方式:多表连接查询

    在多表连接查询的场景下,Hibernate提供了几种不同的方法来处理数据关联,包括HQL(Hibernate Query Language)查询、Criteria API以及传统的JPA(Java Persistence API)注解。 1. **HQL查询**: Hibernate Query...

    Hibernate(多对多表操作)

    3. **配置映射文件**:虽然在JPA中,我们通常使用注解进行映射,但在某些情况下,可能还需要编写XML映射文件。在`hibernate.cfg.xml`或`persistence.xml`中添加相应的配置。 4. **处理关联**:在业务逻辑中,我们...

    hibernate的多态查询

    标题“hibernate的多态查询”指的是在Hibernate框架中,如何进行涉及不同子类的对象查询,这是ORM(对象关系映射)中的一个重要特性,旨在提高代码的灵活性和可扩展性。多态查询允许我们编写一次查询,而无需关心...

    Hibernate多对多关联添加及查询示例

    在Java编程领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本示例主要关注的是Hibernate中的多对多关联映射及其添加与查询方法。 多...

    Hibernate-基础联表模板

    在实际业务中,往往需要涉及多张表的数据交互,这就需要用到联表查询。Hibernate提供了多种联表查询方式,如:`JOIN`, `LEFT JOIN`, `RIGHT JOIN`, `FULL JOIN`等,这些都可以通过HQL(Hibernate Query Language)...

    Struts2+Hibernate实现一对多联表查询

    在Hibernate中,这种关系可以通过在实体类中使用`@OneToMany`注解来定义。例如,在`Department`类中,我们可以定义一个`List<Employee>`类型的属性,表示部门下的所有员工,同时通过`mappedBy`指定在`Employee`类中...

    Hibernate_query查询数据表中部分字段.

    在进行字段查询时,我们需要在映射文件中明确指出哪些字段会被使用。 1. **Hibernate查询语言(HQL)**: Hibernate 提供了自己的查询语言 HQL,类似于 SQL,但面向对象。例如,如果你想查询一个表中特定的字段,...

    hibernate中文参考文档

    11. Hibernate查询语言:Hibernate Query Language(HQL)是用于操作持久化数据的一种面向对象的查询语言,这部分将介绍HQL的基本语法和高级特性。 12. 条件查询:条件查询是数据库操作中常见的需求,文档会讲解...

    Hibernate5中文用户使用手册

    Hibernate5中文用户使用手册涉及了Hibernate框架的核心使用方法和高级特性,覆盖了从基础概念到高级特性的全方位内容,本手册的结构和内容包含以下几个方面: Hibernate概述:Hibernate是一个纯Java的关系型持久层...

    Hibernate多表查询.txt

    在多表查询中,HQL支持通过逗号分隔的表名来表示联合查询,同时利用`where`子句来定义表之间的关联条件。例如,在示例代码中,通过`from tBookInfo book, BookSelection sel where book.id = sel.bookId`这样的HQL...

    关于Hibernate3中文查询出错问题的解决

    在使用Hibernate3进行数据库操作时,中文查询出错是一个常见的问题,这主要涉及到字符编码、数据库配置以及Hibernate的设置等多个方面。以下将详细介绍如何解决这个问题。 首先,我们要明白错误的根源通常在于字符...

    hibernate实现动态SQL查询

    在Hibernate中,我们通常使用HQL(Hibernate Query Language)或Criteria API进行查询,但这些方式并不支持复杂的动态查询。为了实现动态SQL,我们可以借助于Hibernate的QBC(Query By Criteria)和Criteria API,...

Global site tag (gtag.js) - Google Analytics