1. 程式人生 > >HibernateTemplate常用方法

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