getHibernateTemplate()常用方法
一、find(String queryString);
示例:this.getHibernateTemplate().find("from bean.User");
返回所有User對象
二、find(String queryString , Object value);
示例:this.getHibernateTemplate().find("from bean.User u where u.name=?", "test");
或模糊查詢:this.getHibernateTemplate().find("from bean.User u where u.name like ?", "%test%");
返回name屬性值為test的對象(模糊查詢,返回name屬性值包含test的對象)
三、find(String queryString, Object[] values);
示例:String hql= "from bean.User u where u.name=? and u.password=?" this.getHibernateTemplate().find(hql, new String[]{"test", "123"});
返回用戶名為test並且密碼為123的所有User對象
四、findByExample(Object exampleEntity) 示例:
User u=new User();
u.setPassword("123" );//必須 符合的條件但是這兩個條件時並列的(象當於sql中的and) u.setName("bb" );
list=this .getHibernateTemplate().findByExample(u,start,max);
返回:用戶名為bb密碼為123的對象
五、findByExample(Object exampleEntity, int firstResult, int maxResults) 示例:User u=new User();
u.setPassword("123" );//必須 符合的條件但是這兩個條件時並列的(象當於sql中的and) u.setName("bb" );
list=this .getHibernateTemplate().findByExample(u,start,max);
返回:滿足用戶名為bb密碼為123,自start起共max個User對象。(對象從0開始計數)
六、findByNamedParam(String queryString , String paramName , Object value)
使用以下語句查詢:
String queryString = "select count(*) from bean.User u where u.name=:myName"
String paramName= "myName"; String value= "xiyue";
this .getHibernateTemplate().findByNamedParam(queryString, paramName, value); System.out.println(list.get(0 )); 返回name為xiyue的User對象的條數
七、 findByNamedParam(String queryString , String[] paramName , Object[] value) 示例:
String queryString = "select count(*) from bean.User u where u.name=:myName and u.password=:myPassword"
String[] paramName= new String[]{"myName", "myPassword"}; String[] value= new String[]{"xiyue", "123"};
this .getHibernateTemplate().findByNamedParam(queryString, paramName, value); 返回用戶名為xiyue密碼為123的User對象
八、findByNamedQuery(String queryName) 示例:
1、首先需要在User.hbm.xml中定義命名查詢 <hibernate-mapping> <class>......</class>
<query name="queryAllUser "><!--此查詢被調用的名字-->
<![CDATA[
from bean.User ]]> </query> </hibernate-mapping>
2、如下使用查詢:
this .getHibernateTemplate().findByNamedQuery("queryAllUser ");
九、findByNamedQuery(String queryName, Object value) 示例:
1、首先需要在User.hbm.xml中定義命名查詢 <hibernate-mapping> <class>......</class>
<query name="queryByName "><!--此查詢被調用的名字--> <![CDATA[
from bean.User u where u.name = ? ]]> </query> </hibernate-mapping> 2、如下使用查詢:
this .getHibernateTemplate().findByNamedQuery("queryByName ", "test");
十、findByNamedQuery(String queryName, Object[] value) 示例:
1、首先需要在User.hbm.xml中定義命名查詢 <hibernate-mapping> <class>......</class>
<query name="queryByNameAndPassword "><!--此查詢被調用的名字-->
<![CDATA[
from bean.User u where u.name =? and u.password =?
]]> </query> </hibernate-mapping> 2、如下使用查詢:
String[] values= new String[]{"test", "123"};
this .getHibernateTemplate().findByNamedQuery("queryByNameAndPassword " , values);
十一、findByNamedQueryAndNamedParam(String queryName, String paramName, Object value) 示例:
1、首先需要在User.hbm.xml中定義命名查詢 <hibernate-mapping> <class>......</class>
<query name="queryByName "><!--此查詢被調用的名字--> <![CDATA[
from bean.User u where u.name =:myName ]]> </query> </hibernate-mapping> 2、如下使用查詢:
this .getHibernateTemplate().findByNamedQuery("queryByName " , "myName", "test");
十二、findByNamedQueryAndNamedParam(String queryName, String[] paramName, Object[] value) 示例:
1、首先需要在User.hbm.xml中定義命名查詢 <hibernate-mapping> <class>......</class>
<query name="queryByNameAndPassword "><!--此查詢被調用的名字-->
<![CDATA[
from bean.User u where u.name =:myName and u.password=:myPassword ]]> </query>
</hibernate-mapping>
2、如下使用查詢:
String[] names= new String[]{"myName", "myPassword"}; String[] values= new String[]{"test", "123"};
this .getHibernateTemplate().findByNamedQuery("queryByNameAndPassword " , names, values);
十 三、findByValueBean(String queryString , Object value); 示例:
1、定義一個ValueBean,屬性名必須和HSQL語句中的:后面的變量名同名,此處必須至少有兩個屬性,分別為myName和 myPassword,使用setter方法設置屬性值后
ValueBean valueBean= new ValueBean(); valueBean.setMyName("test"); valueBean.setMyPasswrod("123"); 2、
String queryString= "from bean.User u where u.name=:myName and u.password=:myPassword";
this .getHibernateTemplate().findByValueBean(queryString , valueBean);
十 四、findByNamedQueryAndValueBean(String queryName , Object value); 示例:
1、首先需要在User.hbm.xml中定義命名查詢 <hibernate-mapping> <class>......</class>
<query name="queryByNameAndPassword "><!--此查詢被調用的名字-->
<![CDATA[
from bean.User u where u.name =:myName and u.password=:myPassword ]]> </query> </hibernate-mapping>
2、定義一個ValueBean,屬性名必須和User.hbm.xml命名查詢語句中的:后面的變量名同名,此處必須至少有兩個屬性,分別為 myName和myPassword,使用setter方法設置屬性值后
ValueBean valueBean= new ValueBean(); valueBean.setMyName("test"); valueBean.setMyPasswrod("123"); 3、
String queryString= "from bean.User u where u.name=:myName and u.password=:myPassword";
this .getHibernateTemplate().findByNamedQueryAndValueBean("queryByNameAndPassword ", valueBean);
hibernatetemplate hibernate 使用 總結
使用HibernateTemplate的方法進行CRUD操作,其中查詢操作通常可分為兩種, 一種為固定條件查詢,
另一種為動態多條件查詢(如查詢界面的實現),固定條件查詢可以很方便地通過createQuery,find()等方法實現,但是我在動態條件查詢的實 現過程中,hibernate0可以實現英文的條件查詢,而中文條件則會出現亂碼。現將具體的過程描述如下: 固定條件查詢
可以使用常規的方法,如 Java代碼
getHibernateTemplate().find(),getHibernateTemplate().createQuery()等
getHibernateTemplate().find(),getHibernateTemplate().createQuery()等
動態多條件查詢
由於查詢條件的不確定性,我曾嘗試用拼參數的方法將拼好的sql語句傳入
find(qlStr),但是查詢時hibernate會將中文的條件報為亂碼。 不過如果條件全部是英文參數的話拼sql是可以的。亂碼報錯如下: 3:49,946 INFO [STDOUT] Hibernate:
select incometype0_.id as id, incometype0_.name as name0_,
incometype0_.type_comment as type3_0_ from income_type incometype0_ where 1=1 and incometype0_.type_comment='·á????×?????'
因此這種方法無法使用。另外find()的另一種find(String arg0,Object[] arg1),采用數組參數將sql的條件參數傳入的方式只是適合固定條件參數的查詢,不適合這種動態多條件的中文查詢,因此也無法使用。
說明:由於find(String arg0,Object[] arg1)采用數組參數的方式可以使用中文條件查詢,因此可以確定不是我的編碼問題。而是Hibernate0的find(sqlStr)方法本身的問 題。
為此只能換成另一種實現途徑,如下: 實現途徑: 得到session ,用Query q = session.createQuery(sql);該方法返回一個Query 類型,利用q.setString(String arg0,String arg1)將參數賦值給sql的參數條件。在sql語句中拼一次參數,在setString()中也拼一次賦值。 如:
Java代碼
public List phraseQuery(final String id, final String name,final String typecomment) { StringBuffer sql = new StringBuffer(); sql.append("from IncomeType where 1=1 "); if (id != null && id.length() > 0) sql.append(" and id = :id "); if (name != null && name.length() > 0) sql.append(" and name = :name "); if (typecomment != null && typecomment.length() > 0) sql.append(" and typeComment = :tc "); final String typeSql = new String(sql); return (List) getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(typeSql); if (id != null && id.length() > 0) q.setString("id", id); if (name != null && name.length() > 0) q.setString("name", name); if (typecomment != null && typecomment.length() > 0) q.setString("tc", typecomment); return q.list(); } }); } public List phraseQuery(final String id, final String name, final String typecomment) { StringBuffer sql = new StringBuffer(); sql.append("from IncomeType where 1=1 "); if (id != null && id.length() > 0) sql.append(" and id = :id "); if (name != null && name.length() > 0) sql.append(" and name = :name "); if (typecomment != null && typecomment.length() > 0) sql.append(" and typeComment = :tc "); final String typeSql = new String(sql); return (List) getHibernateTemplate().execute( new HibernateCallback() {public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(typeSql); if (id != null && id.length() > 0) q.setString("id", id); if (name != null && name.length() > 0) q.setString("name", name); if (typecomment != null && typecomment.length() > 0) q.setString("tc", typecomment); return q.list(); } }); }
以上方法可以實現動態中文條件查詢,在有的書中看到並不推薦用find()方法,find()只提供一些簡單的HQL查詢,不具有動態綁定參數的功能,在 將來的hibernate新版本中,有可能會淘汰find()方法,而Query接口才是真正的HQL查詢接口,提供更為豐富的功能。基於此,可能對於一 個將被淘汰的方法find()不支持中文也就不足為奇了。^_^畢竟人家重心轉移了。而且find()中拼sql字符串的方式雖然是實現查詢的常用手段, 實現起來也比較方便,但是不利於hibernate更好地利用緩存,而采用Query接口可以更好地利用緩存,提高程序執行效率。
HibernateTemplate的常用方法簡介:
q void delete(Object entity):刪除指定持久化實例
q deleteAll(Collection entities):刪除集合內全部持久化類實例
q find(String queryString):根據HQL查詢字符串來返回實例集合
q findByNamedQuery(String queryName):根據命名查詢返回實例集合
q get(Class entityClass, Serializable id):根據主鍵加載特定持久化類的實例
q save(Object entity):保存新的實例
q saveOrUpdate(Object entity):根據實例狀態,選擇保存或者更新
q update(Object entity):更新實例的狀態,要求entity是持久狀態
q setMaxResults(int maxResults):設置分頁的大小
q void delete(Object entity):刪除指定持久化實例
q deleteAll(Collection entities):刪除集合內全部持久化類實例
q find(String queryString):根據HQL查詢字符串來返回實例集合
q findByNamedQuery(String queryName):根據命名查詢返回實例集合
q get(Class entityClass, Serializable id):根據主鍵加載特定持久化類的實例
q save(Object entity):保存新的實例
q saveOrUpdate(Object entity):根據實例狀態,選擇保存或者更新
q update(Object entity):更新實例的狀態,要求entity是持久狀態
q setMaxResults(int maxResults):設置分頁的大小