若class的lazy设为false,则get(),load(),find(),都会立即检索。
若class的lazy设为true,表示采用延迟策略,load()返回的是代理类的实例(只有OID存在,其它属性都为null),代理类的特征:代理类继承实际类的所有属性和方法。当程序第一次访问代理类实例时(除访问OID外),才会去数据库加载对象的所有数据。
注:代理类的实例只有在当前session范围内才能被初始化。get(),find(),仍是立即检索。
常用的查询语句(HQl):
连接查询: from Customer c left join fetch c.orders o where c.name like 't%' (orders 集合被初始化)
动态实例化查询: select new com.mypack.CustomerRow(c.id,c.name,o.orderNumber) from Customer c join c.orders o where o.orderNumber like 't%'
distinct关键字:Iterator it=session.createQuery("select distinct c.name from Customer c").list().iterator();
聚集函数:
Object [] os=(Object [])session.createQuery("select max(c.age),min(c.age) from Customer c").uniqueResult();
理解:多列返回Object [] 类型,单列返回Object 类型
子查询:from Customer c where 1<(select count(o) from c.orders o)(相关)
对应sql:select * from customers c where 1<(select count(o.ID) from orders o where c.ID=o.customer_ID)
from Order o where o.price >(select avg(o1.price) from Order o1)(无关)
字查询量化关键字:all any some in exists
HQL操纵集合的函数,属性:size,minIndex ,maxIndex,minElement,maxElement elements
eg:from Customer c where c.orders.size>0
from Customer c where size(c.orders)>0
分组查询:
Iterator it=session.createQuery("select c.name,count(c) from Customer c group by c.name").list().iterator();
while(it.hasNext()){
object [] pair=(Object [])it.next();
String name=(String)pair[0];
Integer count=(Integer)pair[1];
}
oracle下执行存储过程:
create or replace procedure batchUpdateCustomer(p_age in number) as
begin
update CUSTOMERS set AGE=AGE+1 where AGE>p_age;
end;
以上存储过程有一个参数p_age,代表客户的年龄,应用程序可按照以下方式调用存储过程:
tx = session.beginTransaction();
Connection con=session.connection();
String procedure = "{call batchUpdateCustomer(?) }";
CallableStatement cstmt = con.prepareCall(procedure);
cstmt.setInt(1,0); //把年龄参数设为0
cstmt.executeUpdate();
tx.commit();
连接查询总结:
迫切左外连接查询和左外连接查询:
我们看以下代码,这段代码将覆盖映射文件中的检索策略,显示指定采用迫切左外连接查询。
HQL查询方式:
Query query=session.createQuery(“from Customer c left join fetch c.orders o where c.name like ‘zhao%’ ”);
List list=query.list();
HashSet set=new HashSet (list);//这种可能有重复的原素用来过滤的
for(Iterator it=set.iterator();it.hasNext();)
{
Customer customer=(Customer)it.next();
.....
}
//QBC检索方式:
List list=session.createCriteria(Customer.class).setFetchMode(“orders”,FetchMode.EAGER)
.add(Expression.like(“name”,”zhao%”,MatchMode.START).list();
for(int i=0;i Customer customer=(Customer)list.get(i);
}
我们看到在HQL以及QBC查询中分别通过left join fetch和FetchMode.EAGER来指定采用迫切左外连接检索策略,当采用了迫切左外连接检索策略时,当进行检索时即执行查询的list()方法时,将会立即初始化用来容纳关联实体的集合对象元素,如果在实体映射配置文件中对关联实体设置了延迟加载,那么此时将会忽略延迟加载设置,而采用迫切左外连接策略,并且立即用关联实体对象填充集合对象元素,即使用Order对象填充Customer对象的orders集合。因此这种检索策略会马上创建关联实体对象,此时我想你一定会想到这种检索策略会同时检索出Customer和Order实体对象对应的数据,并且分别创建这两个对象。恭喜你答对了,因此上面代码会生成类似如下的SQL语句:
Select * from customer c left join order o on c.id=o.id where c.name like ‘zhao%’;
如果我们忽略了fetch关键字,就变成了左外连接查询,如下面代码:
Query query=session.createQuery(“from Customer c left join c.orders o where c.name like ‘zhao%’ ”);
List list=query.list();
for(int i=0;i Object[] objs=(Object[])list.get(i);
Customer customer=(Customer) objs[0];
order order=(Order)objs[1];
}
我们可以看到采用左外连接查询返回的结果集中包含的是对象数组,对象数组中的每个元素存放了一对相互关联的Customer对象和Order对象,而迫切左外连接会返回Customer对象,与Customer对象相关联的Order对象存放在Customer对象的集合元素对象中,这就是迫切左外连接和左外连接查询的其中一个区别(这两种检索生成的SQL语句是一样的),另一个区别是当使用左外连接时,对关联对象的检索会依照实体映射配置文件所指定的策略,而不会像迫切左外连接那样忽略它,比如此时对Customer对象关联的Order对象采用延迟加载,那么左外连接检索也会使用延迟加载机制检索Order对象。
理解:当使用左外连接时和迫切左外连接的时执行的sql是一样的..只不过 left join 没有对应的集合没有关连..当第一次检索时会添加对应的引用的(hibernate 不会再创建象的,对象是已经存在的)
查询性能优化:
1.降低访问数据库的频率,减少sql语句数目:使用迫切左外连接或迫切内连接检索
,使用查询缓存
2.避免多余加载程序不需要访问的数据:使用延迟,集合过滤.
3.避免报表查询数据占用缓存(查询出来的是持久化对象,会存在session缓存中),利用投影查询功能,查询出实体部分属性(查询出来的是关系数据)
4.用第二次查询时..用iterator代替list()(iterator()首先去数据库检索ID字段,然后要据ID字段到Hibernate的第一级缓存以及第二级缓存中查找匹配的Customer对象,如果存在,就直接把它加入到查询结果集中,否则就执行额外的select语句,根据ID字段到数据库检索该对象)
hibernate三种对象的特征:
1.临时(new 下的)
2.持久:位于一个session实例的缓存中,方法有:save(),load(),get(),update()。。
3.游离:不位于session缓存中,与数据库中有对应记录.方法有:session.close().这样session 中的所有持久对象都变成游离的..evict()
分享到:
相关推荐
【图像检索分类算法研究】是计算机科学与技术领域的一个重要课题,主要关注如何通过图像的颜色特征来实现图像的检索和分类。在这个课题中,学生需要深入理解基于内容的图像检索(CBIR)的重要性和基本原理,同时掌握...
一个图像检索分类系统(基于服装数据) 使用库python3 Flask 0.12.2 Flask-Bootstrap 3.3.7.1 Flask-Cors 3.0.2 Flask-Dropzone 1.4.3 Flask-Script 2.0.6 Flask-Uploads 0.2.1 Flask-WTF 0.14.2 gevent 1.2.1 Keras ...
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目...一个图像检索分类系统(基于服装数据)(python源码+项目说明).zip
在这个领域,我们主要关注几个关键概念:分类、聚类、分词、检索和信息过滤。 1. **分类**:分类是将信息或文档根据预定义的类别进行分配的过程。这通常涉及使用监督学习算法,如朴素贝叶斯、支持向量机或决策树,...
**信息检索分类** 信息检索可以根据检索手段分为两大类:手工检索和机械检索。手工检索依赖于传统纸质资源如图书、期刊和目录卡片,具有良好的回溯性,但效率较低。而机械检索,也就是计算机检索,借助数据库实现...
信息检索分类有全文检索、超文本检索、超媒体检索等多种方式。信息检索策略有两种方式,即手工检索和计算机检索。信息检索工具常用的排验方法有字序法、类序法。 文献类型根据出版物载体的不同,主要划分为图书、...
本资源为南华大学2021级文献检索考试答案宣贯.pdf,旨在帮助学生了解文献检索的重要性、文献类型、获取方法、分类检索、著录格式等知识点。 一、文献类型 在文献检索中,文献类型是非常重要的概念。根据考试答案,...
目录检索:只对分类名和内容简介进行关键词检索,而不对网页内容的全文进行关键词检索;...网页检索:数据量大,网页更新快,关键词检索功能强,查全率高,尤其在检索分类不明的主题或专指的知识点时优势明显。
本系统具备中文自动分词、全文检索、统计等基本功能,具体介绍如下: 1、中文自动分词 1)能对给定的中文文本进行自动分词、词性一级、词性二级标注; 2)支持大批量文本的自动分词及词性标注处理,可处理各级...
### 网络搜索引擎分类目录检索功能研究 #### 引言 随着互联网的飞速发展,网络成为全球信息交流的主要平台,人们对于信息的需求日益增长。网络搜索引擎作为信息检索的关键工具,扮演着不可或缺的角色。本文将深入...
**多媒体检索分类** - **文本检索**:基于文本内容的检索。 - **多媒体检索**:包括图像、视频、音频等多类型数据的检索。 - **图像检索**:侧重于图像特征的匹配和检索。 - **视频检索**:关注视频序列的特征分析...
- 可限定检索类型,选择检索分类号或索取号,设定时间范围(1至12个月)进行检索。 - 检索结果会显示相关详细信息,包括状态和位置,但同样不能预约。 5. **分类引导检索模块**: - 操作与新书新刊通报模块相同...
分类索引按照学科体系对文献进行分类,如在CA(Chemical Abstracts)中,可以按照化学物质的类别进行检索;主题索引则是根据文献的主题或概念进行索引,便于用户通过主题词找到相关文献。 在CA中,可以利用分子式...
模糊聚类处理则是指在特征提取后,将具有相似特征的数据分为一类,这对于后续的检索分类具有指导意义。通过这种方法,可以将数据集中的信息进行有效整合和分类,提高检索的精确度和效率。 再次,为了进一步优化检索...
1. 等级式主题分类法:如大多数网络检索分类系统,以等级结构划分,类目可细分,并按字顺或人为次序排列。 2. 分面组配分类系统:允许类目间的组合,增强表达力,适用于复杂的主题分类。 3. 学科分类法系统:依据...
24. **信息检索分类**:按照检索对象,可以分为数据检索、事实检索和文献检索。 25. **检索语言**:关键词是自然语言,可以直接使用用户的表达进行检索。 26. **影响因子**:衡量期刊影响力的国际通用指标,反映了...
以下是对标题“信息检索 文本分类 文本预处理 分词”以及描述“现代信息检索,文本分类的流程,重要概念”的详细解析。 ### 1. 信息检索 信息检索(Information Retrieval,IR)是指从大量信息集合中,依据用户的...
kmeans聚类,多数据检索分类,处理原始数据