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