Hibernate三种状态;query查询;ResultTransformer转换为pojo对象;能够将query语句写在xml中;Criteria查询;ProjectionList总和/f分组等函数
版权声明:本文为博主原创文章,未经博主同意不得转载。
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分组等函数的更多相关文章
- [转]hibernate三种状态详解
本文来自 http://blog.sina.com.cn/u/2924525911 hibernate 三种状态详解 (2013-04-15 21:24:23) 转载▼ 分类: hibernate ...
- 简单理解Hibernate三种状态的概念及互相转化
本文描述了Hibernate三种状态的概念及互相转化.Java对象的生命周期中有三种状态,而且互相转化.它们分别是临时状态,持久化状态,以及游离状态. AD:WOT2015 互联网运维与开发者大会 热 ...
- Hibernate三种状态,缓存,以及update更新问题
一. Hibernate中对象的三种状态 1. 瞬时状态(transient) 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,此时该对象只是通过JVM获得了一块 ...
- Hibernate三种状态的转换
hibernate的状态 hibernate的各种保存方式的区(save,persist,update,saveOrUpdte,merge,flush,lock)及 对象的三种状态 hibernate ...
- Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用 引自http://www.blogjava.net/TiGERTiAN/archive/2008/10/25/236519.html
Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object ...
- hibernate 三种状态的转换
一.遇到的神奇的事情 使用jpa操作数据库,当我使用findAll()方法查处一个List的对象后,给对这个list的实体进行了一些操作,并没有调用update 或者 saveOrUpdate方法,更 ...
- SSH框架之-hibernate 三种状态的转换
一.遇到的神奇的事情 使用jpa操作数据库,当我使用findAll()方法查处一个List的对象后,给对这个list的实体进行了一些操作,并没有调用update 或者 saveOrUpdate方法,更 ...
- Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用
Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object ...
- Hibernate三种状态:瞬时状态、持久化状态、离线状态
三种状态及相互转化 瞬时状态(transient):刚new出来一个对象,还没有被保存到数据库中 持久化状态(persistent):已经被保存到数据库中或刚从数据库中取得 离线状态(detached ...
随机推荐
- [Redis] redis数据备份恢复与持久化
数据库备份,使用save命令,将会在redis的安装目录中生成dump.rdb 例如:在我的目录下 redis/src/dump.rdb 使用命令config get dir,获取当前redis的安装 ...
- git分支简介,理解HEAD,master
为了真正理解 Git 处理分支的方式,我们需要回顾一下 Git 是如何保存数据的. 或许你还记得 起步 的内容,Git 保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照. 在进行提交操作时, ...
- oracle数据库逐步学习总结【基础二】
原创作品,转载请在文字开头明显位置注明出处:https://www.cnblogs.com/sunshine5683/p/10067872.html 接着上一篇,继续总结! 五.oracle表管理 首 ...
- Java - String, Stringbuilder, StringBuffer比较
http://www.cnblogs.com/zuoxiaolong/p/lang1.html
- Java方法的参数传递方式为: 值传递
Java方法的参数传递方式为: 值传递 对于基本数据类型作为参数传递时, 是"按值传递", 这点都认识很清楚. 但是, 当对象或者说引用作为参数传递, Java 的参数传递方式是& ...
- webpack2引入bootstrap的坑
在webpack官网教程的代码分离-css章节中,给出的例子是这样的. //安装 ExtractTextWebpackPlugin 如下 npm install --save-dev extract- ...
- gulp自动化打包及静态文件自动添加版本号
前端自动化打包发布已是一种常态,尤其在移动端,测试过程中静态资源的缓存是件很头疼的事情,有时候明明处理的bug测试还是存在,其实就是缓存惹的祸,手机不比pc浏览器,清理缓存还是有点麻烦的.所以自动化实 ...
- 浅析javascript高阶函数
什么是高阶函数:在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数: 1. 接受一个或多个函数作为输入: 2. 输出一个函数.在数学中它们也叫做算子(运算符)或泛函.微积分中的导数就是常见的例 ...
- 使用sa-jdi.jar dump 内存中的class
前言 在分析一个 jar 包时发现他把关键类采用了运行时使用 classloader 的方式加载了.懒得分析算法了,可以使用 jdk 自带的工具 dump 出需要的class. 正文 从运行的java ...
- 用Use Case获取需求的方法是否有缺陷,还有哪些地方需要改进
(提示:是否对所有应用领域都适用?使用的方便性?......) Use Case使用原则: 1.通过讲简单的故事来传递消息 讲故事是最有效的人与人交流信息的途径.通过讲故事(Use Case),团队成 ...