HibernateTemplate常用方法
HibernateTemplate常用方法
(本文章內容相當於轉載自:http://www.tuicool.com/articles/fU7FV3,只是整理了一下內容結構和修改了部分內容,方便閱讀)
一、獲取HibernateTemplate物件
HibernateTemplate hibernateTemplate=HibernateTemplate() ; //當然還有很多種其他的獲取方式
下面的例子都是用hibernateTemplate物件
二、HibernateTemplate常用方法
1、find(String queryString);
示例:hibernateTemplate.find("from bean.User");
返回所有User物件
2、find(String queryString , Object value);
示例:hibernateTemplate.find("from bean.User u where u.name=?", "test");
或模糊查詢:hibernateTemplate.find("from bean.User u where u.name like ?", "%test%");
返回name屬性值為test的物件(模糊查詢,返回name屬性值包含test的物件)
3、find(String queryString, Object[] values);
示例:String hql= "from bean.User u where u.name=? and u.password=?";
hibernateTemplate.find(hql, new String[]{"test", "123"});
返回使用者名稱為test並且密碼為123的所有User物件
4、findByExample(Object exampleEntity)
示例:User u=new User();
u.setPassword("123" );
u.setName("bb" ); //必須符合的條件但是這兩個條件時並列的(象當於sql中的and)
list=hibernateTemplate.findByExample(u);
返回:使用者名稱為bb密碼為123的物件
5、findByExample(Object exampleEntity, int firstResult, int maxResults)
示例:User u=new User();
u.setPassword("123" );
u.setName("bb" ); //必須 符合的條件但是這兩個條件時並列的(象當於sql中的and)
list=hibernateTemplate.findByExample(u,start,max);
返回:滿足使用者名稱為bb密碼為123,自start起共max個User物件。(物件從0開始計數)
6、findByNamedParam(String queryString , String paramName , Object value)
示例:String queryString = "select count(*) from bean.User u where u.name=:myName" ;
String paramName= "myName";
String value= "abc";
list=hibernateTemplate.findByNamedParam(queryString, paramName, value);
System.out.println(list.get(0 ));
返回:name為abc的User物件的條數
7、 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[]{"abc", "123"};
hibernateTemplate.findByNamedParam(queryString, paramName, value);
返回:使用者名稱為abc密碼為123的User物件
8、findByNamedQuery(String queryName)
示例:
1、首先需要在User.hbm.xml中定義命名查詢
<hibernate-mapping>
<class>......</class>
<query name="queryAllUser "> <!--此查詢被呼叫的名字-->
<![CDATA[
from bean.User
]]>
</query>
</hibernate-mapping>
2、如下使用查詢:
hibernateTemplate.findByNamedQuery("queryAllUser ");
9、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、如下使用查詢:
hibernateTemplate.findByNamedQuery("queryByName ", "test");
10、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"};
hibernateTemplate.findByNamedQuery("queryByNameAndPassword " , values);
11、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、如下使用查詢:
hibernateTemplate.findByNamedQuery("queryByName " , "myName", "test");
12、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"};
hibernateTemplate.findByNamedQuery("queryByNameAndPassword " , names, values);
13、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";
hibernateTemplate.findByValueBean(queryString , valueBean);
14、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";
hibernateTemplate.findByNamedQueryAndValueBean("queryByNameAndPassword ", valueBean);
三、hibernatetemplate hibernate 使用總結
使用HibernateTemplate的方法進行CRUD操作,其中查詢操作通常可分為兩種, 一種為固定條件查詢,另一種為動態多條件查詢(如查詢介面的實現),固定條件查詢可以很方便地通過createQuery,find()等方法實現,但是我在動態條件查詢的實現過程中,hibernate0可以實現英文的條件查詢,而中文條件則會出現亂碼。現將具體的過程描述如下:
1、固定條件查詢
可以使用常規的方法,如 Java程式碼
hibernateTemplate.find(),hibernateTemplate.createQuery()等
hibernateTemplate.find(),hibernateTemplate.createQuery()等
2、動態多條件查詢
由於查詢條件的不確定性,我曾嘗試用拼引數的方法將拼好的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()中也拼一次賦值。 如:
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) hibernateTemplate.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) hibernateTemplate.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(); } }); }
22:43:09
2018-12-24