1. 程式人生 > >Hibernate 中得查詢(hql,離線)和getHibernateTemplate()常用方法彙總

Hibernate 中得查詢(hql,離線)和getHibernateTemplate()常用方法彙總

1.hql通過getHibernateTemplate()

(1) 回撥介面getHibernateTemplate().execute(new HibernateCallback())方法

public User getEmailByUsername(final String username) {//通過使用者名稱找到郵箱號啟用郵箱
        //HQL
        return getHibernateTemplate().execute(new HibernateCallback<User>() {
        @Override
        public User doInHibernate(Session session) throws HibernateException {
        String hql = "from User where username = ? ";
        Query query = session.createQuery(hql);
        query.setParameter(0, username);
        User user = (User) query.uniqueResult();
        return user;
                    }
                });
    }

https://blog.csdn.net/langjian2012/article/details/39121933

(2)通過獲取session

ublic void updateEmailername(String username) {//通過使用者名稱修改郵箱啟用狀態
        Session session = getHibernateTemplate().getSessionFactory().openSession();
        Transaction trans=session.beginTransaction();
        String hql="update User user set user.enabled=1 where user.username ='"+username+"'";
        Query queryupdate=session.createQuery(hql);
        queryupdate.executeUpdate();
        trans.commit();
        }

2.離線查詢

Hibernate提供了Criteria物件,使用者動態加入查詢條件,使在跟根據指定查詢條件查詢更加靈活。

public class ProductDao extends HibernateDaoSupport {

public List<Product> findHot() {

DetachedCriteria criteria = DetachedCriteria.forClass(Product.class);

criteria.add(Restrictions.eq("is_hot", 1));

criteria.addOrder(Order.desc("pdate"));

List<Product> list = (List<Product>) this.getHibernateTemplate().findByCriteria(criteria, 0, 10);

return list;

}

3.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                          ]]&gt;                    </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程式碼

 
  1. public List phraseQuery(final String id, final String name,final String typecomment) {

  2. StringBuffer sql = new StringBuffer(); sql.append("from IncomeType where 1=1 "); if (id != null && id.length() > 0) sql.append(" and id = :id ");

  3. if (name != null && name.length() > 0) sql.append(" and name = :name ");

  4. if (typecomment != null && typecomment.length() > 0) sql.append(" and typeComment = :tc "); final String typeSql = new String(sql);

  5. return (List) getHibernateTemplate().execute( new HibernateCallback() {

  6. public Object doInHibernate(Session session)

  7. throws HibernateException, SQLException {

  8. Query q = session.createQuery(typeSql);

  9. if (id != null && id.length() > 0) q.setString("id", id);

  10. if (name != null && name.length() > 0) q.setString("name", name);

  11. if (typecomment != null

  12. && typecomment.length() > 0)

  13. q.setString("tc", typecomment);

  14. return q.list(); } }); }

  15. public List phraseQuery(final String id, final String name, final String typecomment) {

  16. StringBuffer sql = new StringBuffer();

  17. sql.append("from IncomeType where 1=1 "); if (id != null && id.length() > 0) sql.append(" and id = :id ");

  18. if (name != null && name.length() > 0) sql.append(" and name = :name ");

  19. if (typecomment != null && typecomment.length() > 0) sql.append(" and typeComment = :tc ");

  20. final String typeSql = new String(sql);

  21. return (List) getHibernateTemplate().execute( new HibernateCallback() {public Object doInHibernate(Session session) throws HibernateException, SQLException {

  22. Query q = session.createQuery(typeSql); if (id != null && id.length() > 0) q.setString("id", id);

  23. if (name != null && name.length() > 0) q.setString("name", name); if (typecomment != null

  24. && typecomment.length() > 0) q.setString("tc", typecomment);

  25. 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):設定分頁的大小