天天看點

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類的源代碼

public class PersonDAOHibernate implements PersonDAO  

{  

   //采用log4j來完成調試時的日志功能  

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

   //以私有的成員變量來儲存SessionFactory。  

private SessionFactory sessionFactory;  

//以私有變量的方式儲存HibernateTemplate  

private HibernateTemplate hibernateTemplate = null;  

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

   public void setSessionFactory(SessionFactory sessionFactory)  

          this.sessionFactory = sessionFactory;  

   }  

        //初始化本DAO所需的HibernateTemplate  

public HIbernateTemplate getHibernateTemplate()  

        //首先,檢查原來的hibernateTemplate執行個體是否還存在  

        if ( hibernateTemplate == null)  

        {  

                  //如果不存在,建立一個HibernateTemplate執行個體  

                  hibernateTemplate = new HibernateTemplate(sessionFactory);  

        }  

        return hibernateTemplate;  

}  

        //傳回全部的人的執行個體  

   public List getPersons()  

        {        

                  //通過HibernateTemplate的find方法傳回Person的全部執行個體  

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

   public void savePerson(Person person)  

        {                  

                  getHibernateTemplate().saveOrUpdate(person);  

        /**  

         * @ param personid 需要删除Person執行個體的主鍵  

         * /  

   public void removePerson(int personid)  

                  //先加載特定執行個體  

          Object p = getHibernateTemplate().load(Person.class, new Integer(personid));  

                  //删除特定執行個體  

          getHibernateTemplate().delete(p);  

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

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

/*

/**

* 使用hql 語句進行操作

  * @param hql

* @param offset

* @param length

* @return List

*/  

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

   final int length) {  

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

   public Object doInHibernate(Session session)  

     throws HibernateException, SQLException {  

    Query query = session.createQuery(hql);  

    query.setFirstResult(offset);  

    query.setMaxResults(length);  

    List list = query.list();  

    return list;  

  });  

  return list;  

* 使用criterion進行操作

* @param arg

* @param criterions

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

    Criteria criteria = session.createCriteria(arg);  

    //循環周遊添加限制條件  

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

     criteria.add(criterions[i]);  

    }  

    criteria.setFirstResult(offset);  

    criteria.setMaxResults(length);  

    return criteria.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() { ... }

本文轉自 00_yatou 51CTO部落格,原文連結:http://blog.51cto.com/ql0722/1656016,如需轉載請自行聯系原作者

上一篇: jquery筆記
下一篇: js筆記