版权声明:本文为博主原创文章,未经博主同意不得转载。

https://blog.csdn.net/u010026901/article/details/24256091

Session操作过程中的pojo对象存在三种状态:

1)  瞬时态:该对象在数据库中没有相应的数据

2)  持久态:数据库中存在该对象相应的数据。同一时候操作该对象的Session也存在。

3)  游离态:数据库中包括该对象相应的数据。但操作此对象的Session已经不存在或被关闭了。

 

三种状态之间的转换:

瞬时 à 持久:save(),saveOrUpdate()

持久 à 瞬时:delete()

持久 à 游离:close()

游离 à 持久:update(),saveOrUpdate()

 

 

针对持久态对象。Hibernate还存在下面两个特点:

1)  持久态对象,在同一Session中仅仅存在同一个。

a)         假设连接不关闭,多次查询同一条数据。仅仅返回同一个对象,也就是仅仅查询一次数据库。

b)        此功能也被称为一级缓存,但实际开发中有用性非常低。

2)  改动持久态对象的属性,能够自己主动同步到数据库相应的数据中。

a)         当改动了一个持久态对象的属性,兴许又有操作并且提交了事务,则数据库自己主动调用更新操作,也一起改动。

b)        当登陆后。要求将当前系统时间,作为最后登陆时间保存到数据库中时,能够使用。

Session中get和load方法的差别?

1)  假设没有查询到数据,get会返回null。而load则直接提示错误。

2)  使用load查询时。可能会出现下面错误,由于load方式使用的是懒汉式载入方法。

运行load方法时,不立马查询数据库。

当用到查询出的对象的属性时。才载入数据。游离态会报错

public
void
doRemove(Integer id) throws Exception {

       // 注意,使用Hibernate删除时,必须先查询对象,再删除.

       //HibernateSessionFactory.getSession().delete(findById(id));

       String hql = "DELETE FROMNews AS n WHERE n.id = ?" ;

       Query query = HibernateSessionFactory.getSession().createQuery(hql);

       query.setInteger(0, id);

       query.executeUpdate();

    }

1)  当删除一条数据时,直接使用Session.delete(),由于简单。

2)  批量删除时,使用HQL形式。

    public
void
doUpdate(News vo) throws Exception {

       //HibernateSessionFactory.getSession().update(vo);

       String hql = "UPDATE NewsAS n SET n.title = ?,n.content = ? WHERE n.id = ?" ;

       Query query = HibernateSessionFactory.getSession().createQuery(hql);

       query.setString(0, vo.getTitle());

       // ....其它參数一样设置

       query.executeUpdate();

    }

1)  假设是直接的改动功能,肯定选择Session.update方法

2)  假设是仅仅改某一个字段。使用HQL方式,比如:改动password

针对HQL的查询功能,也支持写SELECT。能够通过编写SELECT,来仅仅查询对象中某一个或某几个属性。

public List testHQL()throws Exception {

       String hql = "SELECTn.id,n.title FROM News AS n";

       Query query = HibernateSessionFactory.getSession().createQuery(hql);

       return query.list();

    }

但查询两个以上的字段时,返回的是List<Object[]>,每一条查询出的数据。使用Object[]来表示。

public
void
testHQL() throws Exception {

       List all = ServiceFactory.getINewsServiceInstance().testHQL();

       Object[]value1 = (Object[])all.get(0);

       System.out.println(value1[1]);

    }

这样使用起来非常麻烦,因此在Hibernate3.2以上的版本号中。提供了一个自己主动转换类,能够将查询出的Object[],自己主动转换为pojo 对象。

public List testHQL()throws Exception {

       String hql = "SELECT n.idAS id,n.titleAS title FROM News ASn";

       Query query = HibernateSessionFactory.getSession().createQuery(hql);

        query

              .setResultTransformer(newAliasToBeanResultTransformer(

                     News.class));

 

       return query.list();

    }

Query有一个子接口是SQLQuery,该类支持SQL语句的处理,但实际开发中一般不用。

String sql = "SELECT id AS id,title AS title,content AScontent,pub_date AS pubDate FROM news";

       SQLQuery query = HibernateSessionFactory.getSession().createSQLQuery(

              sql);

       query

              .setResultTransformer(new AliasToBeanResultTransformer(

                     News.class));

       return query.list();

但。注意。在Oracle数据库中,为了提高性能,Oracle自己主动将所有字段名转换为大写。因此假设想要使用,必须将pojo对象的属性也写为大写才干设置。

Hibernate还能够将语句写到配置文件里。

    <queryname="findAll">

       FROM News AS n WHERE n.title LIKE ?

    </query>

通过程序读取配置文件,取得这段HQL,并生成Query对象。完毕查询。

Query query =HibernateSessionFactory.getSession().getNamedQuery(

              "findAll");

       query.setString(0,
"%測试%");

       return query.list();

Criteria也是Hibernate提供的一个查询对象,支持按对象的方式来完毕查询

public List<News> testCriteria()throws Exception {

       // 依据传入的pojo类型,查询该类型相应的所有数据

       Criteria c = HibernateSessionFactory.getSession().createCriteria(

              News.class);

       // 1、WHERE id =26

       //c.add(Restrictions.eq("id", 26));

       // 2、WHERE id> 26

       //c.add(Restrictions.gt("id", 26));

       // 3、WHERE id< 26

       // c.add(Restrictions.lt("id",26));

       // 4、WHERE id>= 26

       //c.add(Restrictions.ge("id", 26));

       // 5、WHERE id<= 26

       //c.add(Restrictions.le("id", 26));

       // 6、WHERE id<> 26

       //c.add(Restrictions.ne("id", 26));

       // 7、WHEREtitle LIKE '%測试%'

       // c.add(Restrictions.like("title","%測试%"));

       // 8、WHERE idbetween 23 and 27

       //c.add(Restrictions.between("id", 23, 27));

       // 9、WHERE idIN (23,25,27)

       // List<Integer> allIds= new ArrayList<Integer>();

       // allIds.add(23);

       // allIds.add(25);

       // allIds.add(27);

       //c.add(Restrictions.in("id", allIds));

       // 10、复杂条件,须要使用and或or来连接各个条件

       // WHERE id = 23 OR (id<> 26 AND title LIKE '%測试%')

       c.add(Restrictions.or(Restrictions.eq("id",
23),Restrictions

                     .and(Restrictions.ne("id", 26),Restrictions.like(

                            "title","%測试%"))));

 

       returnc.list();

    }

假设想增加ORDER BY排序条件,须要使用Order对象。

c.addOrder(Order.desc("id"));

假设想增加统计函数和分组函数,则须要用到Projection这个类

ProjectionList pro =Projections.projectionList();

       // 增加统计函数

       pro.add(Projections.rowCount());

       // 还能够增加分组条件

       pro.add(Projections.groupProperty("title"));

       c.setProjection(pro);

Hibernate三种状态;query查询;ResultTransformer转换为pojo对象;能够将query语句写在xml中;Criteria查询;ProjectionList总和/f分组等函数的更多相关文章

  1. [转]hibernate三种状态详解

    本文来自 http://blog.sina.com.cn/u/2924525911 hibernate 三种状态详解 (2013-04-15 21:24:23) 转载▼   分类: hibernate ...

  2. 简单理解Hibernate三种状态的概念及互相转化

    本文描述了Hibernate三种状态的概念及互相转化.Java对象的生命周期中有三种状态,而且互相转化.它们分别是临时状态,持久化状态,以及游离状态. AD:WOT2015 互联网运维与开发者大会 热 ...

  3. Hibernate三种状态,缓存,以及update更新问题

    一. Hibernate中对象的三种状态 1. 瞬时状态(transient) 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,此时该对象只是通过JVM获得了一块 ...

  4. Hibernate三种状态的转换

    hibernate的状态 hibernate的各种保存方式的区(save,persist,update,saveOrUpdte,merge,flush,lock)及 对象的三种状态 hibernate ...

  5. Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用 引自http://www.blogjava.net/TiGERTiAN/archive/2008/10/25/236519.html

    Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object ...

  6. hibernate 三种状态的转换

    一.遇到的神奇的事情 使用jpa操作数据库,当我使用findAll()方法查处一个List的对象后,给对这个list的实体进行了一些操作,并没有调用update 或者 saveOrUpdate方法,更 ...

  7. SSH框架之-hibernate 三种状态的转换

    一.遇到的神奇的事情 使用jpa操作数据库,当我使用findAll()方法查处一个List的对象后,给对这个list的实体进行了一些操作,并没有调用update 或者 saveOrUpdate方法,更 ...

  8. Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用

    Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object ...

  9. Hibernate三种状态:瞬时状态、持久化状态、离线状态

    三种状态及相互转化 瞬时状态(transient):刚new出来一个对象,还没有被保存到数据库中 持久化状态(persistent):已经被保存到数据库中或刚从数据库中取得 离线状态(detached ...

随机推荐

  1. [转] ASP.NET MVC 模型绑定的功能和问题

    摘要:本文将与你深入探究 ASP.NET MVC 模型绑定子系统的核心部分,展示模型绑定框架的每一层并提供扩展模型绑定逻辑以满足应用程序需求的各种方法. 同时,你还会看到一些经常被忽视的模型绑定技术, ...

  2. JavaScript 学习(一)

        此篇为学习笔记 JS 简介 JavaScript 是一种轻量级的脚本编程语言JavaScript 是可插入 HTML 页面的编程代码.JavaScript 插入 HTML 页面后,可由所有的现 ...

  3. Java多态-如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   Cat c = new ...

  4. 写一个有字符界面的ssh链接工具

    大概的样子 这是大致的样子- 写之前想说的 因为个人工作的的电脑是deepin系统的,系统本身的命令行非常好用,用第三方的ssh工具用不习惯,就想自己写一个. shell脚本是第一次写,写的不是很好, ...

  5. javascript中的undefined与null的区别

    一.相似性 在JavaScript中,将一个变量赋值为undefined或null,老实说,几乎没区别. var a = undefined; var a = null; 上面代码中,a变量分别被赋值 ...

  6. 分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC (转载 不错)

    分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC 1 一致性 1.1 简述 一致性,是指对每个节点一个数据的更新,整个集群都知道更新,并且是一致的 假设一个具有N个节点的分布式系统,当 ...

  7. python学习之老男孩python全栈第九期_day029知识点总结——configparser模快、logging模块

    一. configparser模块 生成文档 import configparser config = configparser.ConfigParser() config[', 'Compressi ...

  8. 使用sshkey连接github等服务器

    平常使用git时因为用了https的方式,所以经常要输入密码,其实我们是可以通过这个公钥连接github git.oschina.net等服务器,这样可以省去了我们输入用户名密码这么一个步骤了. 1. ...

  9. 微信支付报错:time_expire时间过短,刷卡至少1分钟,其他5分钟]

    查了下代码: $input->SetTime_expire(date("YmdHis", time() + 600));//二维码过期时间.默认10min 10分钟,没问题. ...

  10. 初识js-charts和E-charts

    在前端开发的过程中,经常会使用到图表相关的东西,很多时候,图表在展示数据方面有着无与伦比的优势.下面我们就来看看两个常用的图表相关的插件jscharts和ECharts.前者,功能相对单一,但是不依赖 ...