`

Hibernate基本知识(三)

 
阅读更多

1、 对象的状态

<1>瞬时对象是new出来的,与Session和数据库都无关;

<2>持久对象是放入Session中,与Session有关的,Hibernate可以检测到,更新对象的值,可以影响到数据库中的值;

<3>脱管对象是在存入数据库,session关闭的时候由持久对象变换过来的,因此它只与数据库有关,因此Hibernate检测不到,数据库要更新需要更新语句update。

<4>Hibernate只能检测到Session中的对象变化情况。

<5>当不知道对象是瞬时的还是脱管的,如果要保存或更新数据库中的值,这个时候就需要用到saveOrUpdate(),让Hibernate去判断该对象是什么状态。

2、 HQLCriteria

<1>HQL查询(官方推荐)

String hql = "from User as user where user.name=?";

Query query = session.createQuery(hql);

query.setString(0, name);

List<User> list = query.list(); //如果有多条记录,用list

User u = (User)query.uniqueResult();//确定查到结果集只有一条记录录时使用

对于上面的hql语句,我们可以这样写(为name取别名):

String hql = "from User as user where user.name=:n";

query.setString(“n”, name);

Hibernate中的分页可以用以下语句:

query.setFirstResult(100); //从哪一条开始查询

query.setMaxResults(20); //每页显示多少条

<2>Criteria条件查询(比较常用,功能有限)

Criteria c = session.createCriteria(User.class);

c.add(Restrictions.eq(“name”,name)); //从数据库中查出等于name数据

c.add(Restrictions.lt(“birthday”,new Date());//查出小于birthday数据

分页语句:

c.setFirstResult(0); //从哪一条开始查询

c.setMaxResults(10); //每页显示多少条

List<User> list = c.list(); //如果有多条记录,用list

User u = (User)c.uniqueResult();//确定查到的结果集只有一条记录时使用

<3>、外置命名查询(很少用)

在实体映射文件的<class>标签后加上如下配置:

<!-- 外置命名查询(例子:TestOutName) -->

<!--

<query name="queryUser">

<![CDATA[from User u where u.id>?]]>

</query>

调用时如下:

Session session = HibernateUtil.getSession();

Query query = null;

session.beginTransaction();

query = session.getNamedQuery("queryUser");

List<User> urs = query.setParameter(0, 5).list();

for(User u : urs) {

System.out.println("id:"+u.getId()+" name:"+u.getName()+" createTime:"+u.getCreateTime());

session.getTransaction().commit();

<4>、过滤器(很少用)

过滤器配置如下:

<class>标签中加入如下代码:

<filter name="idFilter" condition="id &gt;:uid"></filter>

<class>标签外加入如下代码:

<filter-def name="idFilter">

<filter-param name="uid" type="integer"/>

</filter-def>

例子代码:

session.beginTransaction();

session.enableFilter("idFilter").setParameter("uid", 4);

query = session.createQuery(“from User”);

List<User> urs = query.list();

for(User u : urs) {

System.out.println("id:"+u.getId()+" name:"+u.getName()+" createTime:"+u.getCreateTime());

}

session.getTransaction().commit();

<5>内、外连接问题

l 内连接

内连接就是满足Document中的uid等于User的id时,将两个表的数据连接成类似一张表信息的过程。

from Document d inner join d.user on d.uid=d.user.id

l 外连接

外连接分为左外连、右外连和全外连。

外连接是将两个表的信息都一一对应后进行连接,得到结果行数可能是两表行数的乘积。下面两个HQL语句功能相同。

select * from User u,Document d where u.id=d.user.id

select * from User u outter join Document d on u.id = d.user.id

<6>、聚合函数和子查询

在HQL*只能出现在count(*)中。

select d.user.name, count(*) from Document d group by d.user having count(*)>1 order by d.user.id";

<7>、Iterator查询与N+1问题

Session session = HibernateUtil.getSession();

Query query = null;

try {

session.beginTransaction();

query = session.createQuery("from User u where u.id>=4 and u.id<=6");

List<User> urs = query.list();

for(User u : urs) {

System.out.println("id:"+u.getId()+" name:"+u.getName()+" createTime:"+u.getCreateTime());

}

//上面通过List查询过的那些User将会在缓存中存在,当下面的Iterator再查询的时候,它会先从数据库查出所有User的ID,然后再用ID从缓存中找,如果缓存中有的话,就从缓存中取,不用向数据库发select语句。

System.out.println("======================================");

query = session.createQuery("from User");

Iterator<User> iter = query.iterate();

while(iter.hasNext()) {

User u = iter.next();

System.out.println("id:"+u.getId()+" name:"+u.getName()+" createTime:"+u.getCreateTime());

}

session.getTransaction().commit();

} catch (HibernateException e) {

session.getTransaction().rollback();

e.printStackTrace();

} finally {

HibernateUtil.closeSession();

}

<8>、导航查询

给个例子如下:(利用本对象中另外对象的属性条件来查询本对象的信息)

String hql = "from Document d where d.user.name=?";

Session session = HibernateUtil.getSession();

Query query = null;

session.beginTransaction();

query = session.createQuery(hql);

query.setParameter(0, "user5");

List<Document> ds = query.list();

for(Document d : ds) {

System.out.println("id:"+d.getId()+" title:"+d.getTitle()+" content:"+d.getContent()+" createTime:"+d.getCreateTime());

<9>、HQL中的DML(很少用)

hql的DML语句不受缓存管理,所以很少使用

示例代码:

3、 HibernateCURD的模板代码如下:

4、 Hibernate中对象状态图

flush()可以清除临时缓存,以保证执行的顺序。

evict()可以将对象从缓存中剔除,使其从持久态变为脱管态。

clear()可以将缓存中的所有对象剔除。

lock()可以为某对象加锁机制。

分享到:
评论

相关推荐

    StrutsSpringHibernate基本知识

    StrutsSpringHibernate基本知识,清楚易懂

    hibernate基本知识点

    hibernate基本知识点,里面有关于hibernate的配置说明,hibernate的讲解

    hibernate基本架构

    文档阐述了hibernate基本架构的使用,可以作为hibernate学习的基础知识

    hibernate4知识点及配置说明

    hibernate4基本知识点,常见问题解决方案,基本配置注意事项

    最新版本的Struts2+Spring4+Hibernate4框架整合

    同时使用了Struts2、Spring4、Hibernate4、log4j、slf4j、junit4、ehcache等库或框架,搭建一个最基本的项目原型。 三、 三大框架最新版本下载:截止2014-10-01 Struts2.3.6:发布于2014-05-03,目前的最新版本。...

    struts2 spring hibernate框架技术与项目实战 光盘源码

    详细讲解了S2SH框架技术的基本知识和使用方法,从Eclipse开发平台、JSP、Servlet等基础知识讲起,由浅入深,重点介绍了当前流行的三个轻量级开源框架:Struts2、Spring和Hibemate.

    Hibernate介绍ppt

    介绍很全的 Hibernate PPT,基本上知识点涉及很全

    Hibernate3开发.pdf

    系统学习Hibernate3的开发知识,循序渐进 第一章:Hibernate入门 包括:是什么、ORMapping原理、能干什么、有什么、怎么做(做什么) ... 包括:分增删改查的操作说明Hibernate基本的实现原理 第八章:最佳实践

    Struts,Hibernate,Spring集成开发宝典.pdf

    《Struts Hibernate Spring集成开发宝典》以Struts,Hibernate,Spring为核心详细地讲解了这三个组件的基础知识和基本使用方法,并通过一系列集成开发实例讲解了这三个组件在J2EE项目中的应用。《Struts Hibernate ...

    Struts+Spring+Hibernate开发实例 (SSH整合)

    本文并不想介绍Struts,Spring,Hibernate的原理系统架构等,本文地目的是通过一...以及那些已经了解Struts,Spring,Hibernate的基本概念,但是还没有亲身在较复杂的项目中体验Struts+Spring+Hibernate的开发人员。

    spring4.1.6+hibernate4.3.9+struts2.3.20整合

    整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.20 + Spring4.1.6 + Hibernate4.3.9。 此外,还有:log4j、slf4j、junit4、ehcache等知识点。 项目...

    疯狂Ajax讲义:Prototype/jQuery+DWR+Spring+Hibernate整合开发(part01)

    《疯狂Ajax讲义:Prototype/jQuery+DWR+Spring+Hibernate整合开发》是《基于J2EE的Ajax...第9章以后的内容则需要掌握Spring、Hibernate等Java EE知识,建议先认真阅读疯狂Java体系的《轻量级Java EE企业应用实战》一书。

    Hibernate实战(第2版 中文高清版)

    第三部分 会话对象处理  第9章 使用对象   9.1 持久化生命周期   9.1.1 对象状态   9.1.2 持久化上下文   9.2 对象同一性和等同性   9.2.1 引入对话   9.2.2 对象同一性的范围   9.2.3 脱管对象的同...

    hibernate学习

    是很好的教材,案例写的很详细,基本知识要点都在上面,hibernate基本都够用了

    hibernate应用开发完全手册源码(5-16)

    Hibernate的环境搭建及使用Hibernate时必须掌握的基本技术等基础知识;在Hibernate中映射关联关系、事务应用、检索策略、映射值类型集合等高级应用;小型网站或应用程序的开发思路、方法和过程;基于Struts+...

    Struts+hibernate含金量很高的例子

    从此,你就会用hibernate进行基本操作了。并且程序中不再有sql语句,实现了很好的封装. 里面还有个文档: 讲解hibernate基础的 1. 什么是hibernate? 2. hibernate的知识内容 3. 什么是对象持久化?对象持久化有...

    Struts Hibernate Spring集成开发宝典 源码

    《Struts Hibernate Spring集成开发宝典》以Struts,Hibernate,Spring为核心详细地讲解了这三个组件的基础知识和基本使用方法,并通过一系列集成开发实例讲解了这三个组件在J2EE项目中的应用。《Struts Hibernate ...

    struts,hibernate,spring 开发宝典

    Struts Hibernate Spring集成开发宝典》中文pdf版 计算机电子书下载,《Struts Hibernate Spring集成开发宝典》以Struts,Hibernate,Spring为核心详细地讲解了这三个组件的基础知识和基本使用方法,并通过一系列集成...

    Struts+Hibernate+Spring集成开发

    Struts Hibernate Spring集成开发宝典》中文pdf版 计算机电子书下载,《Struts Hibernate Spring集成开发宝典》以Struts,Hibernate,Spring为核心详细地讲解了这三个组件的基础知识和基本使用方法,并通过一系列集成...

    Struts Hibernate Spring集成开发宝典.part1

    《Struts Hibernate Spring集成开发宝典》中文pdf版 计算机电子书下载,《Struts Hibernate Spring集成开发宝典》以Struts,Hibernate,Spring为核心详细地讲解了这三个组件的基础知识和基本使用方法,并通过一系列...

Global site tag (gtag.js) - Google Analytics