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



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

  • 相关阅读:
    uva 11294 Wedding
    uvalive 4452 The Ministers’ Major Mess
    uvalive 3211 Now Or Later
    uvalive 3713 Astronauts
    uvalive 4288 Cat Vs. Dog
    uvalive 3276 The Great Wall Game
    uva 1411 Ants
    uva 11383 Golden Tiger Claw
    uva 11419 SAM I AM
    uvalive 3415 Guardian Of Decency
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10546100.html
Copyright © 2011-2022 走看看