Hibernate增刪改查的HQL語句

轉自:原地址

Hibernate的所有的操作都是通過Session完成的.

基本步驟如下:

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

     SessionFactory sessionFactory=new Configuration().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);

   List rsList=query.list();

   iterator it=rsList.iterator();

   Person person=null;

   while(it.haseNext()){

     person=(Person)it.next();

    }

   return person;

   }
session.delete()- -
session.delete(obj)將obj的狀態變爲transient。兩種情況
1)obj是session的cache裏邊的cache沒有的,比如:
         session.delete(new Employee(4));
2)obj存在於session的cache中,比如:
         Employee employee = (Employee)session.load(Employee.class, new Integer(4));
         session.delete(employee);

這兩種情況都是允許的,hibernate都會發送一條delete語句給數據庫。

delete執行之後,如果調用了session.load(), 又可以分爲兩種情況:
1)在session.flush()之前,如:
           tx.beginTransaction();
    session.delete(new Employee(4));
           session.load(Employee.class, new Integer(4));//發生在session.flush()之前
           tx.commit();
      那麼hibernate會拋出ObjectDeletedException:The object with that id was deleted:

2)在session.flush()之後,如:
           tx.beginTransaction();
    session.delete(new Employee(4));
           session.load(Employee.class, new Integer(4));
           tx.commit();

           tx.beginTransaction();
           session.load(Employee.class, new Integer(4));//同一個session中,上面的tx.commit()將session flush了一次。
           tx.commit();
      那麼這個時候hibernate僅僅會拋出ObjectNotFoundException:No row with the give…
表示找不到該object。如果第二個tx裏邊採用session.get()也就不會拋出exception了。

delete執行之後,如果調用了session.save(obj):
           tx.beginTransaction();
           Employee employee = (Employee)session.load(Employee.class, new Integer(4));
     session.delete(employee);
           System.out.println(employee);
           session.save(employee);
           System.out.println(employee);
           tx.commit();
      這種情況是完全合理的,合法的,
      delete將employee從persistent的狀態變爲transient的狀態。
      save將employee從transient狀態變爲persistent的狀態。
      save一個被delete的obj的時候,在save處hibernate強制執行session.flush(),發送delete語句,然後按照常規的save流程來進行。爲什麼要這麼做,還沒有完全想明白。

delete執行之後,如果對obj對象屬性的修改,tx.commit()時不會進行dirtyChecking。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章