Hibernate常用方法整理

Hibernate常用方法整理

HibernateTemplate提供非常多的常用方法來完成基本的操作,比如通常的增加、刪除、修改、查詢等操作,Spring 2.0更增加對命名SQL查詢的支持,也增加對分頁的支持。大部分情況下,使用Hibernate的常規用法,就可完成大多數DAO對象的CRUD操作。下面是HibernateTemplate的常用方法簡介:

qvoid delete(Object entity):刪除指定持久化實例

qdeleteAll(Collection entities):刪除集合內全部持久化類實例

qfind(String queryString):根據HQL查詢字符串來返回實例集合

qfindByNamedQuery(String queryName):根據命名查詢返回實例集合

qget(Class entityClass, Serializable id):根據主鍵加載特定持久化類的實例

qsave(Object entity):保存新的實例

qsaveOrUpdate(Object entity):根據實例狀態,選擇保存或者更新

qupdate(Object entity):更新實例的狀態,要求entity是持久狀態

qsetMaxResults(int maxResults):設置分頁的大小

下面是一個完整DAO類的源代碼


[java] view plaincopy


  1. public class PersonDAOHibernate implements PersonDAO  

  2.  

  3. {  

  4.  

  5.    //採用log4j來完成調試時的日誌功能  

  6.  

  7. private static Log log = LogFactory.getLog(NewsDAOHibernate.class);  

  8.  

  9.    //以私有的成員變量來保存SessionFactory。  

  10.  

  11. private SessionFactory sessionFactory;  

  12.  

  13. //以私有變量的方式保存HibernateTemplate  

  14.  

  15. private HibernateTemplate hibernateTemplate = null;  

  16.  

  17.         //設值注入SessionFactory必需的setter方法  

  18.  

  19.    public void setSessionFactory(SessionFactory sessionFactory)  

  20.  

  21. {  

  22.  

  23.           this.sessionFactory = sessionFactory;  

  24.  

  25.    }  

  26.  

  27.         //初始化本DAO所需的HibernateTemplate  

  28.  

  29. public HIbernateTemplate getHibernateTemplate()  

  30.  

  31. {  

  32.  

  33.         //首先,檢查原來的hibernateTemplate實例是否還存在  

  34.  

  35.         if ( hibernateTemplate == null)  

  36.  

  37.         {  

  38.  

  39.                   //如果不存在,新建一個HibernateTemplate實例  

  40.  

  41.                   hibernateTemplate = new HibernateTemplate(sessionFactory);  

  42.  

  43.         }  

  44.  

  45.         return hibernateTemplate;  

  46.  

  47. }  

  48.  

  49.         //返回全部的人的實例  

  50.  

  51.    public List getPersons()  

  52.  

  53.         {        

  54.  

  55.                   //通過HibernateTemplate的find方法返回Person的全部實例  

  56.  

  57.           return getHibernateTemplate().find("from Person");  

  58.  

  59.    }  

  60.  

  61.          

  62.  

  63.    public void savePerson(Person person)  

  64.  

  65.         {                  

  66.  

  67.                   getHibernateTemplate().saveOrUpdate(person);  

  68.  

  69.    }  

  70.  

  71.         /**  

  72.  

  73.          * @ param personid 需要刪除Person實例的主鍵  

  74.  

  75.          * /  

  76.  

  77.    public void removePerson(int personid)  

  78.  

  79.         {  

  80.  

  81.                   //先加載特定實例  

  82.  

  83.           Object p = getHibernateTemplate().load(Person.classnew Integer(personid));  

  84.  

  85.                   //刪除特定實例  

  86.  

  87.           getHibernateTemplate().delete(p);  

  88.  

  89.    }  

  90.  

  91. }  

*****************************************************************************************************************************************************************************


hibernateTemplate實現分頁  

Spring 整合 Hibernate 時候用的 HibernateTemplate 不支持分頁,因此需要自己包裝一個類進行分頁,具體實現如下...使用spring的hibernateTemplate的回調機制擴展 hibernateTemplate的功能實現分頁

/*


[java] view plaincopy


  1. /**

  2. * 使用hql 語句進行操作

  3.   * @param hql

  4. * @param offset

  5. * @param length

  6. * @return List

  7. */  

  8. public List getListForPage(final String hql, final int offset,  

  9.    final int length) {  

  10.  

  11.   List list = getHibernateTemplate().executeFind(new HibernateCallback() {  

  12.    public Object doInHibernate(Session session)  

  13.      throws HibernateException, SQLException {  

  14.     Query query = session.createQuery(hql);  

  15.     query.setFirstResult(offset);  

  16.     query.setMaxResults(length);  

  17.     List list = query.list();  

  18.     return list;  

  19.    }  

  20.   });  

  21.   return list;  

  22. }  

  23. /**

  24. * 使用criterion進行操作

  25. * @param arg

  26. * @param criterions

  27. * @param offset

  28. * @param length

  29. * @return List

  30. */  

  31. protected List getListForPage(final Class arg, final Criterion[] criterions,final int offset, final int length) {  

  32.  

  33.   List list = getHibernateTemplate().executeFind(new HibernateCallback() {  

  34.    public Object doInHibernate(Session session)  

  35.      throws HibernateException, SQLException {  

  36.     Criteria criteria = session.createCriteria(arg);  

  37.     //循環遍歷添加約束條件  

  38.     for (int i = 0; i < criterions.length; i++) {  

  39.      criteria.add(criterions[i]);  

  40.     }  

  41.     criteria.setFirstResult(offset);  

  42.     criteria.setMaxResults(length);  

  43.     return criteria.list();  

  44.    }  

  45.   });  

  46.   return list;  

二、註解 @Filters

@org.hibernate.annotations.FilterDef 或@FilterDefs 定義過濾器聲明,爲同名過濾器所用. 
過濾器聲明帶有一個name()和一個parameters()數組. 參數提供了在運行時調整過濾器行爲的能力,過濾器通過@ParamDef註解定義,該註解包含name和type,你還可以爲給定的@FilterDef 定義一個defaultCondition()參數,當所有的@Filter中沒有任何定義時,可使用該參數定義缺省條件. 
@FilterDef (s)可以在類或包一級進行定義. 

現在我們來定義應用於實體或集合加載時的SQL過濾器子句.我們使用@Filter,並將其置於實體或集合元素上. 

@Entity 
@FilterDef(name="minLength", parameters={ @ParamDef( name="minLength", type="integer" ) } ) 
@Filters( { 
   @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length"), 
   @Filter(name="minLength", condition=":minLength <= length") 
} ) 
public class Forest { ... } 

當這些集合使用關聯表來表示關係的時候,你可能需要對於關聯表或者目標實體表應用過濾條件.使用@Filter註解可以在目標實體上添加改類約束. 
但是如果你打算在關聯表上使用,就需要使用@FilterJoinTable註解. 

   @OneToMany 
   @JoinTable 
   //filter on the target entity table 
   @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length") 
   //filter on the association table 
   @FilterJoinTable(name="security", condition=":userlevel >= requredLevel") 
   public Set<Forest> getForests() { ... }


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