hibernate查询,生命周期

时间:2022-02-06 08:58:53

    

6.lazy属性

延迟加载,即是否把主控方属性及关联对象一次性加载到内存中,lazy=false,不立即加载,等到用时再去数据库加载关联对象,lazy=true,立即加载关联对象

7.session关闭后再去加载关联对象,会报异常

课下学习Hibernate 集合映射章节。*****

任务:课堂示例自己写一遍,总结。

8.查询

Criteriac=session.createCriteria(User.class);

c.add(Expression.eq(“userName”,”zz”));

c.add(Expression.eq(“userAge”,21));

Criteria本身只是个查询容器

1:// 创建Criteria对象

Criteria criteria = session.createCriteria(GuestBook.class);

/*当为Object.class时,查出的是所有的数据*/

// 通过查询返回一个集合

List<GuestBook> guestBooks = criteria.list();

2:// 创建Criteria对象

Criteria criteria = session.createCriteria(GuestBook.class);

/ 创建查询条件对象

Criterion criterion =Restrictions.eq("ip","192.168.1.168");

// 添加条件

criteria.add(criterion);

// 再添加筛选条件Expression

criteria.add(Restrictions.like("title", "学习H%"));

// 通过查询返回一个集合

List<GuestBook> guestBooks = criteria.list();

分页:

Criteria.setFirstResult(100);

Criteria.setMaxResults(20);

// 创建Criteria对象

Criteria criteria = session.createCriteria(GuestBook.class);

int pageSize = 5;// 每页的记录数

int pageIndex = 3;// 页码

// 设置每页记录的起始索引 从0开始

criteria.setFirstResult((pageIndex-1)*pageSize);

// 设置每页显示的记录数

criteria.setMaxResults(pageSize);

//添加排序表达式:根据时间子程序

criteria.addOrder(Order.desc("createTime"));

// 通过查询返回该页的数据集合

List<GuestBook> guestBooks = criteria.list();

排序:

     Criteria.addOrder(Order.asc(“”));

     Criteria.addOrder(Order.desc(“”));

Projections Class进行封装分组、统计表达式。

Projections.groupProperty(“age”);

Projections.avg();

Projections.count();

Projections.max();

Projections.min();

……

1、String hql=“from User”;

2、hql=“from com.oracle.entity.User”;

    Query q=session.createQuery(hql);

    List userList=q.list();

查询对象存在继承关系时查询

String hql=“from Account”;

查询数据库中所有库表记录

String hql=“from java.lang.Object”;

String hql=“from User  as uwhere u.userName like ‘z%’ ”;

as/where

1://返回一个List集合

String hql = "from GuestBook whereip='192.168.1.168'";

//创建查询对象

Query query = session.createQuery(hql);

//执行返回集合

List<GuestBook> guestBooks =query.list();

2:查询实体中的一列返回的是一个Object数组

String hql = "select title from GuestBook";

//创建查询对象

Query query = session.createQuery(hql);

//执行返回集合

List<Object> titles = query.list();

3:查询实体中的两列  返回一个Object数组集合

    Stringhql = "select title,ip from GuestBook";

    //创建查询对象

    Queryquery = session.createQuery(hql);

    //执行返回集合

    List<Object[]>objs = query.list();

4:查询返回map集合

String hql ="select new Map(title,ip) from GuestBook";

    //创建查询对象

    Queryquery = session.createQuery(hql);

    //返回集合

    List<Map<String,Object>>list = query.list();

    for(Map<String,Object>map : list){

        System.out.println(map.get("0")+":"+map.get("1"));

    }

String hql ="select new Map(title as title ,ip as ip) from GuestBook";

map.get("title")+":"+map.get("ip")

5:查询返回对象:必须存在此构造方法

    Stringhql = "select new GuestBook(id,title,ip) from GuestBook";

    //创建查询对象

    Queryquery = session.createQuery(hql);

    //执行返回集合

    List<GuestBook>guestBooks = query.list();

6://查询返回唯一对象

    Stringhql = "from GuestBook where id=1";

    //创建查询对象

    Queryquery = session.createQuery(hql);

    //执行查询返回唯一对象

    GuestBookgb = (GuestBook)query.uniqueResult();

7://查询实现排序功能

    Stringhql = "from GuestBook order by createTime desc";

8://分组查询

//查询同一IP地址发布至少2条留言的IP地址信息

String hql="select count(*),ipfrom GuestBook group by ip having count(ip)>1";

9:分页

//创建hql语句 from 类名

String hql = "from GuestBook";

//创建查询对象

Query query = session.createQuery(hql);

//每页显示的记录数

int pageSize = 5;

//页码 

int pageIndex = 1;

//设置每页的第一条记录的起始位置,从0开始

query.setFirstResult((pageIndex-1)*pageSize);

//设置每页的记录数

query.setMaxResults(pageSize);

10://创建hql语句 带参数(占位符)     

String hql = "from GuestBook where titlelike ?";

    //创建查询对象

    Queryquery = session.createQuery(hql);

    //设置参数的值

    query.setString(0,"学习%");

String hql = "from GuestBook where titlelike :title";

query.setString("title","学习%");

11://使用封装参数的方式

        String hql = "from GuestBook wheretitle like :title and ip=:ip";

        //创建查询对象

        Query query = session.createQuery(hql);

        //创建查询参数的JavaBean对象 GBQueryProperty类必须存在

        GBQueryProperty queryProperty = newGBQueryProperty();

        queryProperty.setTitle("学习%");

        queryProperty.setIp("192.168.1.168");

        //设置查询参数Bean

        query.setProperties(queryProperty);

        //执行返回集合

        List<GuestBook> guestBooks =query.list();

Oracle数据库分页的SQL语句:

Select *  from

       ( select  row_.*,  rownum rownum_  from

           ( select

                this_.id as id1_0_0_,

                this_.title as title2_0_0_,

                this_.content as content3_0_0_,

                this_.author as author4_0_0_,

                this_.createTime ascreateTi5_0_0_,

                this_.ip as ip6_0_0_

           From   Tab_GuestBooks this_ )row_   where  rownum <= ?

       )   where rownum_ > ?

 

 

9:Hibernate对象生命周期:

l  对象生命周期:一个对象从被创建开始,到不再使用,被垃圾回收期回收为止。

一个持久化类的实例可能处于三种不同状态中的某一种。这三种状态的定义则与所谓的    持久化上下文(persistencecontext)有关:Hibernate的Session对象就是这个所谓的  持久化上下文

 


瞬时状态(Transient):未与Hibernate Session 关联的对象,不会被持久化到数据库中, 也不会被赋予持久化标识(identifier),如果瞬时(Transient)对象在程序中没有被引 用,它会被垃圾回收器(garbage collector)销毁。使用Hibernate Session可以将其  变为持久(Persistent)状态

l  持久状态(Persistent):在数据库中有对应的记录,并拥有一个持久化标识(identifier)

l  脱管状态(Detached) :脱管(Detached)对象不在持久化管理之内,但对脱管对象的引用依然有效,对象可继续被修改。Detached状态的对象可以再次与某个Session实例相关联而成为Persistent对象 

只更新那些被修改的列,可以通过修改配置dynamic-update=”true”来实现

 

 

 

 

 

 

 

 


10:Load方法与get方法区别:

load()方法可能抛出无法恢复的异常(unrecoverable exception),如果你不确定是否有匹配的行存在,应该使用get()方法,它会立刻访问数据库,如果没有对应的记录,会返回null

11:Hibernate支持包含值 类型的实例:

Set:  无序且无法包含重复元素

private Set images;

<set name="images"table="T_IMAGE">

<key column="id" />

<element type="string"column="path" />

</set>

 

Bag: 无序且允许包含重复元素

private List images;

<bag name="images"table="T_IMAGE">

<key column="id" />

<element type="string"column="path" />

</bag>

 

<idbag name="images"table="T_IMAGE">

<collection-id type="integer"column="img_id">

<generator class="native" />

</collection-id>

<key column="id" />

<element type="string"column="path" />

</idbag>

 

List: 有序且允许包含重复元素

private List images;

<list name="images"table="T_IMAGE">

<key column="id"></key>

<indexcolumn="pos"></index>

<element type="string"column="path"></element>

</list>

 

Map: 包含键和值

private Map words;

 

<map name="words"table="T_WORDS">

<key column="dic_id" />

<map-key type="string" column="word"/>

<element type="string"column="description" />

</map>

 

 

基本步骤如下:

1:通过配置文件得到SessionFactory:

    SessionFactory sessionFactory=newConfiguration().configure().buildSessionFactory();

2:通过SessionFactory 得到一个Session

    Session session=sessionFactory.openSession();

3:通过session进行插入,删除,修改以及查询.

    插入例子:(1)声明一个事务;(2)Session执行save()操作;(3)事务提交;(4)关闭Session,可选.

public void insert(Person p){

  Transaction tran=session.beginTransaction();

  session.save(p);

   tran.commit();

//  session.close();

}

修改例子:(1)声明一个事务;(2)Session执行update()操作;(3)事务提交;(4)关闭Session,可选.

public void update(Person p){

  Transaction tran=session.beginTransaction();

  session.update(p);

  tran.commit();

//  session.close();

}

    删除例子(主键删除,推荐使用):(1) 声明删除的SQl语句;(2)创建session的Query对象;(3)设置Query对象的参数;(4)执行Query的executeUpdate()操作;(5)Session事务提交

public void delete(int id){

  String hql="delete Person as p where p.id=?";

  Query query=session.createQuery(hql);

  query.setInteger(0,id);

  query.executeUpdate();

  session.beginTransaction().commit();

}

   删除例子(对象删除):(1)声明一个事务;(2)Session执行delete()操作;(3)事务提交;(4)关闭Session,可选.

public void delete(Person p){

  Transaction tran = session.beginTransaction();

  session.delete(p);

  tran.commit();

  session.close();

 }

   查询例子:(跟删除差不多) 查询语句不需要事务提交

 

(1) 声明删除的SQl语句;(2)创建session的Query对象;(3)设置Query对象的参数;

  public Persion queryById(int id){

  String hql="from Person as p where p.id=?";

  Query query=session.createQuery();

  query.setInteger(0,id);

   ListrsList=query.list();

  iterator it=rsList.iterator();

  Person person=null;

  while(it.haseNext()){

    person=(Person)it.next();

   }

     returnperson;

 }

 

 

基本步骤如下:

1:通过配置文件得到SessionFactory:

    SessionFactory sessionFactory=newConfiguration().configure().buildSessionFactory();

2:通过SessionFactory 得到一个Session

    Session session=sessionFactory.openSession();

3:通过session进行插入,删除,修改以及查询.

    插入例子:(1)声明一个事务;(2)Session执行save()操作;(3)事务提交;(4)关闭Session,可选.

             

         

            public void insert(Person p){

 

  Transaction tran=session.beginTransaction();

 

  session.save(p);

              

                tran.commit();

  

//  session.close();

           

            }

   

    修改例子:(1)声明一个事务;(2)Session执行update()操作;(3)事务提交;(4)关闭Session,可选.

            public void update(Person p){

 

  Transaction tran=session.beginTransaction();

  session.update(p);

  tran.commit();

//  session.close();

   }

    删除例子(主键删除,推荐使用):(1) 声明删除的SQl语句;(2)创建session的Query对象;(3)设置Query对象的参数;(4)执行Query的executeUpdate()操作;(5)Session事务提交

    public void delete(int id){

  String hql="delete Person as p where p.id=?";

  Query query=session.createQuery(hql);

  query.setInteger(0,id);

  query.executeUpdate();

  session.beginTransaction().commit();

 

           }

   删除例子(对象删除):(1)声明一个事务;(2)Session执行delete()操作;(3)事务提交;(4)关闭Session,可选.

 

   public void delete(Person p){

  Transaction tran = session.beginTransaction();

  session.delete(p);

 

  tran.commit();

  session.close();

 

   }

   查询例子:(跟删除差不多) 查询语句不需要事务提交

 

(1) 声明删除的SQl语句;(2)创建session的Query对象;(3)设置Query对象的参数;

  public Persion queryById(int id){

 

  String hql="from Person as p where p.id=?";

  Query query=session.createQuery();

 

  query.setInteger(0,id);

   ListrsList=query.list();

 

  iterator it=rsList.iterator();

  Person person=null;

 

  while(it.haseNext()){

    person=(Person)it.next();

 

    }

 

  return person;

   }