首页 > Web开发 > 详细

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

时间:2019-03-17 12:09:17      阅读:168      评论:0      收藏:0      [点我收藏+]
版权声明:本文为博主原创文章,未经博主同意不得转载。

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)????????当登陆后。要求将当前系统时间,作为最后登陆时间保存到数据库中时,能够使用。



Sessiongetload方法的差别?

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);

?????? // 1WHERE id =26

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

?????? // 2WHERE id> 26

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

?????? // 3WHERE id< 26

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

?????? // 4WHERE id>= 26

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

?????? // 5WHERE id<= 26

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

?????? // 6WHERE id<> 26

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

?????? // 7WHEREtitle LIKE ‘%測试%‘

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

?????? // 8WHERE idbetween 23 and 27

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

?????? // 9WHERE 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、复杂条件,须要使用andor来连接各个条件

?????? // 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分组等函数

原文:https://www.cnblogs.com/mqxnongmin/p/10546100.html

(0)
(0)
   
举报
评论 一句话评论(0
分享档案
最新文章
教程昨日排行
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!