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
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 plaincopy
/**
* 使用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() { ... }