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,如需轉載請自行聯系原作者