Spring中常用的hql查詢方法 (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的常用方法簡介:

Java代碼

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





下面是一個完整DAO類的源代碼:
Java代碼

    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");  
     
       }  
     
            /** 
    
             * 根據主鍵返回特定實例 
    
             * @ return 特定主鍵對應的Person實例 
    
             * @ param 主鍵值 
    
       public News getNews(int personid) 
    
            { 
    
              return (Person)getHibernateTemplate().get(Person.class, new Integer(personid)); 
    
       } 
    
            /** 
    
             * @ person 需要保存的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);  
    
      }  
    
  }

 

發佈了52 篇原創文章 · 獲贊 24 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章