本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

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 plain copy

  • 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);

  • *****************************************************************************************************************************************************************************

    hibernateTemplate实现分页

    Spring 整合 Hibernate 时候用的 HibernateTemplate 不支持分页,因此需要自己包装一个类进行分页,具体实现如下...使用spring的hibernateTemplate的回调机制扩展 hibernateTemplate的功能实现分页

    [java] view plain copy

  • * 使用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

  • * @param offset

  • * @param length

  • * @return List

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

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

  • public Object doInHibernate(Session session)

  • throws HibernateException, SQLException {

  • 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();

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