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方式,例如:修改密码

针对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三种状态(Transient、Persistent、Detached)各种保存(save,persist,update,saveOrUpdte,merge,flush,lock)区别

    转载地址:http://www.2cto.com/kf/201212/178604.html 一.三种状态(Transient.Persistent.Detached) 在Hibernate中有三种状 ...

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

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

  3. hibernate 三种状态的转换

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

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

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

  5. 【SSH】——Hibernate三种状态之间的转化

    Hibernate的三种状态为:transient.persistent和detached.对这三种状态的理解可以结合Session缓存,在Session缓存中的状态为persistent,另外两种不 ...

  6. hibernate三种状态:临时状态、游离状态、持久化状态

    三种状态的判断标准: con1:是否获得了与数据库现存记录相对应的oid con2:是否存在于Session缓存中 三种状态的定义: if(!con1 && !con2){ trans ...

  7. Hibernate——(3)主键生成策略持久化类的三种状态

    一 持久化类 1.持久化:内存对象--->数据库(硬盘)Hibernate持久化的框架 持久化类:Java对象与数据库中的表建立映射关系            Hibernate就称为持久化类( ...

  8. CoreAPI_对象三种状态

    Hibernate三种状态之一:临时状态(Transient):用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象: Hibernate三种状态之二:持久化状态(P ...

  9. Hibername三种状态(瞬时态 持久态 游离态)

    Hibernate 三种状态,tansient瞬时态.persistent持久态.detached游离态 Hibernate三种状态之一:临时状态 (Transient): 用new创建的对象,它没有 ...

最新文章

  1. C 中 main 函数的参数
  2. Python的注释及乱码 || 变量及类型
  3. 如何获取真实的执行计划
  4. 全局稳定性收敛平衡点为0吗_神经网络的稳定性阐明.pdf
  5. android域账号认证失败,绕过域账户认证失败锁定次数限制的技巧
  6. python os模块详细_python之os模块详解
  7. 漫画:什么是布隆算法?
  8. 【scarletthln 关于算法的一点总结】
  9. C# 实现程序最小化到托盘
  10. (Electronic WorkBench)EWB仿真JK触发器
  11. aauto的listview(类似于C#的datagrid) 支持文件拖拽获取名单
  12. VVC帧内预测(六)MIP
  13. 《草根自媒体达人运营实战》一一1.3 各种自媒体平台及优缺点
  14. UVA 1637 - Double Patience(概率DP)
  15. vmware安装linux虚拟机
  16. 计算机服务器排名,2019服务器CPU天梯图 多路CPU性能排名
  17. 云数据库CynosDB有哪些常见问题?
  18. 【计算机视觉与深度学习】全连接神经网络(一)
  19. Oral English
  20. 通信工程交换传输实习报告

热门文章

  1. 一致性成本 非一致性成本
  2. python-ldap模块
  3. GOOGLE无法访问的解决
  4. vue中v-if和ref的冲突
  5. Linux下配置bond0
  6. 计算机考试准考证打印不了怎么办
  7. 阿小冷学计算机(3)
  8. universe oracle 神谕卡,选择一张神谕卡,它将给目前的你一个心灵启示
  9. 中医理论质疑文章集锦
  10. python3 openCV 实现摄像头录像功能