`

Hibernate查询策略

 
阅读更多
Get与Load(使用这两个方法都根据主键来查询的)
load方式使用延迟加载,所以只有当使用到对象的其它属性时(除主键属性),才加载其他属性,使用主键属性时会直接从session中来找
get方式不使用延迟加载

当使用get方法,访问不存在的记录时,对象返回null
当使用load方法,访问不存在的记录时,会在使用load方法时,直接报ObjectNotFoundException异常

load使用一级缓存(session)
get不用一级缓存(session)(hibernate3.0中,get()也适用缓存),可以使用二级缓存(SessionFactory)(需配置)

所以,尽量使用get方法,来查询


连接查询
以前的关联,当我们使用get(),取出一个持久对象,就能取得跟当前对象关联的其他对象
现在我们可以直接使用HQL语句来的到想要连接查询的数据

内连接
是将多个表中所有关联数据(主外键)相等的查询出来。
例:
显示内连接(one) select …… from 类1 inner join 类1.属性名(属性名就是类1所关联的对象)
注意:
1. 这个HQL语句中没有on子句,因为在表映射时就已经映射了条件。
2. inner join 中的inner也可省略,因为直接join默认是内连接。
隐式内连接(many)from 类1,类2 where 类1.主键=类2.外键

左连接与右连接都是将多个表中不相同的数据也显示出来。
左连接:select …… from 类1 left outer join 类1.属性名

右连接:select …… from 类1 right outer join 类1.属性名
注意:连接操作时尽量返回多个对象


list()和iterate()

iterate()
使用iterate()是先查询缓存的在查数据库,所以会出现N+1的问题(对性能损耗非常大):
 1:会先发送查询列表ID的SQL语句
 N:再依次发出根据ID查询的SQL语句
若是缓存中已有需查询的数据,那就不去查数据库,直接在缓存中取值。
注意:这里的数据与数据库的数据可能不一致

list()
在默认情况下list()每次都会向数据库发出查询对象的SQL,除非配置查询缓存,虽然一级缓存中已有了list()操作所要获得的对象数据,但list()默认情况下不会利用缓存,而再次发出SQL

list()和iterate()的区别:
list():默认情况下list()只会想缓存中放入数据,而不会利用。
iterate():默认情况下会利用缓存,但缓存中没有会出现N+1问题。
注意:如查询中经常使用重复的数据,使用iterator;否则使用list

引用查询
以上的HQL查询,将HQL查询嵌入到了代码中,这样的做法只适合较简洁的HQL语句。
如果HQL很长,跨越多行,这样书写,影响了程序代码的可读性和可维护性。那可以将HQL语句写在配置文件中,这样程序代码的可读性和维护性都会提高。
例:
配置文件中:
<hibernate-mapping>
<class ……></class>
<query name="findCustomerByName">
        <![CDATA[
        from Customer as c where c.customerName like :name(HQL语句)
        ]]>
    </query>
</hibernate-mapping>
代码中:
Query q=session.getNamedQuery("findCustomerByName");(得到HQL语句)
注意:query标签可以写在一个特定的XML文件,这个文件必须部署在配置文件(hibernate.cfg.xml)中(就是配置文件的mapping标签)。


查询对象化
可以在HQL语句中实例化一个对象。
"select new dto.fwxxDTO(f.fwid,f.title,f.zj,f.date)  from  TblFwxx as f where f.title  like '%"+title+"%'"


使用纯SQL语句来查询数据
需表名和字段名,与类名,属性名无关。
使用Session的createSQLQuery方法来查询的到Query,还需使用addEntity方法指定查询出来的值对应哪个类。
例:Query q = session.createSQLQuery(“……”).addEntity(类.class);
注意:一般是用HQL做不出来就用此方法,只有用HQL做不出来就用此方法。


使用HQL语句查询不同表中的几列
使用HQL查询,若指定查询的列那返回的就不是POJO而是Object[],所以得到时应在迭代出List后,取值应强转为Object[]

若在有关联关系的pojo的配置文件中设置fetch
例:

fetch = join;out-join=true 迫切外连接(瞬时加载)
fetch = select ;out-join=false 不是迫切外连接(延时加载)
分享到:
评论

相关推荐

    HIBERNATE检索策略

    标题:“HIBERNATE检索策略” 描述:本文深入解析了HIBERNATE的检索策略,为读者提供了一条清晰的学习路径,重点分析了HIBERNATE中的抓取策略及其应用场景,帮助开发者更有效地管理和优化数据加载过程。 在...

    Hibernate主键策略-sequence

    在Java的持久化框架Hibernate中,主键策略是管理数据库记录唯一标识的重要组成部分。主键策略定义了如何生成和管理实体对象的主键值。在本篇内容中,我们将深入探讨"Hibernate主键策略-sequence",并结合标签中的...

    通用的hibernate查询

    【hibernate查询详解】 Hibernate,作为一款强大的Java对象...而分页查询是大数据量场景下的常用策略,Hibernate提供了简单的API来实现。理解并熟练掌握这些查询方式,将有助于我们在Java开发中更好地运用Hibernate。

    struts+hibernate查询所有记录

    - **性能优化**:合理设计查询语句和缓存策略,减少不必要的数据库交互次数,提高系统响应速度。 - **异常处理**:妥善处理可能出现的各种异常情况,增强系统的健壮性和稳定性。 以上就是关于Struts+Hibernate查询...

    常用Hibernate主键生成策略

    ### 常用Hibernate主键生成策略详解 #### 一、引言 在数据库设计与操作过程中,主键是确保数据唯一性的关键要素之一。在实际应用中,开发者经常需要处理不同类型的数据库,并且需要应对各种不同的主键生成需求。...

    Hibernate各种主键生成策略与配置详解

    关于Hibernate的各种主键生成策略与配置详解

    Hibernate中主键生成策略

    在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...

    hibernate抓取策略和懒加载案例

    在Java的持久化框架Hibernate中,数据访问优化是至关重要的,而抓取策略(Fetch Strategy)和懒加载(Lazy Loading)则是实现这一目标的关键技术。本文将深入探讨这两个概念,并通过具体的案例进行分析。 首先,让...

    hibernate 缓存策略

    本文将深入探讨Hibernate的缓存策略,包括一级缓存、二级缓存以及查询缓存,并结合源码分析其工作原理。 ### 一级缓存 一级缓存是Hibernate默认开启的缓存,也称为Session缓存。每当我们在Session中进行持久化操作...

    hibernate主键生成策略

    【hibernate主键生成策略】是Hibernate框架中用于生成持久化对象主键的重要机制,它决定了如何在数据库中创建唯一的标识符。在SSH(Spring、Struts、Hibernate)架构中,Hibernate作为持久层框架,主键生成策略的...

    Hibernate缓存策略

    Hibernate缓存原理及调优策略 Hibernate缓存原理调优策略

    hibernate的多态查询

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

    Hibernate教程02_ID生成策略

    在Java的持久化框架Hibernate中,ID生成策略是至关重要的一个环节。它是用来唯一标识数据库中每一行记录的关键部分。本教程将详细讲解Hibernate中的ID生成策略,以及如何在实际项目中灵活应用。 首先,ID生成策略是...

    hibernate实现递归查询

    综上所述,通过合理设计实体关系,使用HQL或Criteria API,结合数据库特性和缓存策略,我们可以有效地在Hibernate中实现递归查询,处理树形结构数据。理解递归查询的原理并掌握其实践技巧,对于提升Java企业级应用的...

    Hibernate分页查询原理解读

    通过以上分析可以看出,Hibernate在实现分页查询时考虑到了多种情况,并通过不同的策略实现了对不同数据库的支持。无论是基于LIMIT的分页还是基于ROWNUM的分页,Hibernate都能够很好地适配并提供高效的查询性能。...

    hibernate5--4.检索方式及策略

    2. **Lazy Loading**: 默认情况下,Hibernate采用懒加载策略,只有在实际访问关联对象时才会发起数据库查询。这有助于提高性能,因为不是所有的关联数据都立即加载。 3. **Eager Loading**: 相反于懒加载,急加载会...

    hibernate查询缓存1

    在深入探讨Hibernate查询缓存之前,我们先了解一下Hibernate的基础概念。Hibernate是一个强大的Java持久化框架,它简化了数据库操作,提供了对象关系映射(ORM)功能。在Hibernate中,对象的状态分为瞬时态、持久态...

Global site tag (gtag.js) - Google Analytics