1. 程式人生 > >Hibernate hql 查詢 指定欄位 並獲取結果集

Hibernate hql 查詢 指定欄位 並獲取結果集

1. 查詢整個對映物件所有欄位

Java程式碼  

 

   //直接from查詢出來的是一個對映物件,即:查詢整個對映物件所有欄位    

           String hql = "from Users";    

           Query query = session.createQuery(hql);    

               

           List<Users> users = query.list();    

           for(Users user : users){    

               System.out.println(user.getName() + " : " + user.getPasswd() + " : " + user.getId());    

           }    

       

    輸出結果為:    

   name1 : password1 : 1    

   name2 : password2 : 2    

   name3 : password3 : 3    

 

 

 

2.查詢單個欄位

Java程式碼  

 

   //查詢單個欄位    

           String hql = " select name from Users";    

           Query query = session.createQuery(hql);    

               

           List<String> list = query.list();    

           for(String str : list){    

               System.out.println(str);    

           }    

   輸出結果為:    

   name1    

   name2    

   name3    

 

 

 

3.查詢其中幾個欄位

 

Java程式碼  

 

   //查詢其中幾個欄位    

           String hql = " select name,passwd from Users";    

           Query query = session.createQuery(hql);    

           //預設查詢出來的list裡存放的是一個Object陣列    

           List<Object[]> list = query.list();    

           for(Object[] object : list){    

               String name = (String)object[0];    

               String passwd = (String)object[1];    

                   

               System.out.println(name + " : " + passwd);    

           }    

   輸出結果為:    

   name1 : password1    

   name2 : password2    

   name3 : password3    

 

 

 

4.修改預設查詢結果(query.list())不以Object[]陣列形式返回,以List形式返回

引用

//查詢其中幾個欄位,新增new list(),注意list裡的l是小寫的。也不需要匯入包,這樣通過query.list()出來的list裡存放的不再是預設的Object陣列了,而是List集合了  

       String hql = " select new list(name,passwd) from Users";  

       Query query = session.createQuery(hql);  

       //預設查詢出來的list裡存放的是一個Object陣列,但是在這裡list裡存放的不再是預設的Object陣列了,而是List集合了  

       List<List> list = query.list();  

       for(List user : list){  

           String name = (String)user.get(0);  

           String passwd = (String)user.get(1);  

             

           System.out.println(name + " : " + passwd);  

       }  

       /**

       輸出結果為:

        name1 : password1

       name2 : password2

       name3 : password3

        */

 

5.修改預設查詢結果(query.list())不以Object[]陣列形式返回,以Map形式返回

Java程式碼  收藏程式碼

 

   //查詢其中幾個欄位,新增new map(),注意map裡的m是小寫的。也不需要匯入包,這樣通過query.list()出來的list裡存放的不再是預設的Object陣列了,而是map集合了    

           String hql = " select new map(name,passwd) from Users";    

           Query query = session.createQuery(hql);    

           //預設查詢出來的list裡存放的是一個Object陣列,但是在這裡list裡存放的不再是預設的Object陣列了,而是Map集合了    

           List<Map> list = query.list();    

           for(Map user : list){    

               //一條記錄裡所有的欄位值都是map裡的一個元素,key是字串0,1,2,3....,value是欄位值    

               //如果將hql改為:String hql = " select new map(name as username,passwd as password) from Users";,那麼key將不是字串0,1,2...了,而是"username","password"了    

               String name = (String)user.get("0");//get("0");是get(key),注意:0,1,2...是字串,而不是整形    

               String passwd = (String)user.get("1");    

                   

               System.out.println(name + " : " + passwd);    

           }    

           /**  

           輸出結果為:  

            name1 : password1  

           name2 : password2  

           name3 : password3  

            */    

 

 

6.修改預設查詢結果(query.list())不以Object[]陣列形式返回,以Set形式返回,但是因為Set裡是不允許有重複的元素,所以:username和password的值不能相同。只需將hql改為:String hql = " select new set(name,passwd) from Users";

 

7.修改預設查詢結果(query.list())不以Object[]陣列形式返回,以自定義型別返回

 

自定義類:

 

Java程式碼

 

   package com.domain;    

       

   public class MyUser {    

       

       private String username;    

       private String password;    

   //因為:String hql = " select new  com.domain.MyUser(name,passwd) from Users";所以必須要有接受2個引數的建構函式    

       public MyUser(String username,String password){    

           this.username = username;    

           this.password = password;    

       }    

           

       public String getUsername() {    

           return username;    

       }    

       public void setUsername(String username) {    

           this.username = username;    

       }    

       public String getPassword() {    

           return password;    

       }    

       public void setPassword(String password) {    

           this.password = password;    

       }    

           

           

   }    

 

 

 

 

Java程式碼

 

   //通過query.list()出來的list裡存放的不再是預設的Object陣列了,而是自定義的類MyUser,必須加包名,String hql = "from Users";中的Users類也是必須加包名的,但是因為再Users.hbm.xml裡<hibernate-mapping auto-import="true"> auto-import預設值為true(所以auto-import屬性也可以不寫),自動匯入了    

           String hql = " select new  com.domain.MyUser(name,passwd) from Users";    

           Query query = session.createQuery(hql);    

           //預設查詢出來的list裡存放的是一個Object陣列,但是在這裡list裡存放的不再是預設的Object陣列了,而是MyUser物件了    

           List<MyUser> myUsers = query.list();    

           for(MyUser myUser : myUsers){    

               String name = myUser.getUsername();    

               String passwd = myUser.getPassword();    

               System.out.println(name + " : " + passwd);    

           }    

           /**  

           輸出結果為:  

           name1 : password1  

           name2 : password2  

           name3 : password3  

            */    

 

 

 

8:條件查詢

Java程式碼

 

   //條件查詢,引數索引值從0開始,索引位置。通過setString,setParameter設定引數    

           String hql = "from Users where name=? and passwd=?";    

           Query query = session.createQuery(hql);    

           //第1種方式    

   //      query.setString(0, "name1");    

   //      query.setString(1, "password1");    

           //第2種方式    

           query.setParameter(0, "name1",Hibernate.STRING);    

           query.setParameter(1, "password1",Hibernate.STRING);    

           List<Users> list = query.list();    

           for(Users users : list){    

               System.out.println(users.getId());    

           }    

 

       

Java程式碼

 

   //條件查詢,自定義索引名(引數名):username,:password.通過setString,setParameter設定引數    

           String hql = "from Users where name=:username and passwd=:password";    

           Query query = session.createQuery(hql);    

           //第1種方式    

   //      query.setString("username", "name1");    

   //      query.setString("password", "password1");    

           //第2種方式,第3個引數確定型別    

           query.setParameter("username", "name1",Hibernate.STRING);    

           query.setParameter("password", "password1",Hibernate.STRING);    

           List<Users> list = query.list();    

           for(Users users : list){    

               System.out.println(users.getId());    

           }    

還有一種屬於sql方式,但是可以轉化過來entity

 

相信用過hibernate的兄弟們都會因為多表複雜查詢後,為返回的結果如何組裝到一個VO中而煩惱不已。我也不停的為此而煩惱,但是在看了hibernate的transform後,感覺這個方法還挺管用的。 
     例如現在有兩張表,一張是user表,放了一些使用者的資訊,另外一張表是使用者發表的帖子,裡邊有一個user的外來鍵。我們需要查詢出來,某個人釋出的帖子,sql如下:

Java程式碼  收藏程式碼

  1. select u.userName,p.title,p.addTime from user as u,post as p where u.id=p.userId  


但是我們的POJO對映僅僅是做了user,post表的對映,這個時候,我們需要寫一個PostVO類,裡邊放著了使用者的資訊和帖子的資訊的屬性,設定get\set方法,務必保證這個類裡邊有一個預設的建構函式。 
然後我們開始寫這個資料庫操作的dao,程式碼如下:

Java程式碼  收藏程式碼

  1. String sql = "select u.userName as <span style="color: #ff0000;">userName </span><span style="color: #000000;">,</span>p.title as <span style="color: #ff0000;">title </span>,p.addTime as <span style="color: #ff0000;">addTime</span> from user as u,post as p where u.id=p.userId"  
  2. Query q = factory.getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(PostVO.class));  


紅字部分必須跟PostVO中的屬性一直,這樣就可以返回一個針對PostVO的一個集合。 

其實大家可以看下hibernate這一部分的原始碼就會發現,主要是使用了AliasToBeanResultTransformer這個類,通過sql的查詢,會返回陣列,然後hibernate根據資料表的對映,自動幫我們來set對應的欄位屬性,所以標紅的部分務必要跟VO中的屬性值一直,要不然會報錯的。 
如果需要的話,大家也可以重寫這個類。例如VOResultTransformer。然後在dao中更改成

Java程式碼  收藏程式碼

  1. setResultTransformer(new VOResultTransformer(PostVO.class));  


即可。

 

 

Java程式碼

 

   //條件查詢,通過setProperties設定引數    

           String hql = "from Users where name=:username and passwd=:password";    

           Query query = session.createQuery(hql);    

           //MyUser類的2個屬性必須和:username和:password對應    

           MyUser myUser = new MyUser("name1","password1");    

           query.setProperties(myUser);    

           List<Users> list = query.list();    

           for(Users users : list){    

               System.out.println(users.getId());    

           }  

 

[java] view plaincopy

 

   package com.hp.ts.bca.user.bo;  

     

   import com.hp.ts.bca.common.BaseObject;  

     

   public class StationUser  extends BaseObject {  

       private static final long serialVersionUID = -1175811459644997844L;  

       private int id;  

       private String username;  

       private String officePhone;  

       private String mobilePhone1;  

       private String officeEmail;  

       private Integer ifDefault;  

       public StationUser(int id, String username, String officePhone,  

               String mobilePhone1, String officeEmail, Integer ifDefault) {  

           super();  

           this.id = id;  

           this.username = username;  

           this.officePhone = officePhone;  

           this.mobilePhone1 = mobilePhone1;  

           this.officeEmail = officeEmail;  

           this.ifDefault = ifDefault;  

       }  

       public int getId() {  

           return id;  

       }  

       public void setId(int id) {  

           this.id = id;  

       }  

       public String getUsername() {  

           return username;  

       }  

       public void setUsername(String username) {  

           this.username = username;  

       }  

       public String getOfficePhone() {  

           return officePhone;  

       }  

       public void setOfficePhone(String officePhone) {  

           this.officePhone = officePhone;  

       }  

       public String getMobilePhone1() {  

           return mobilePhone1;  

       }  

       public void setMobilePhone1(String mobilePhone1) {  

           this.mobilePhone1 = mobilePhone1;  

       }  

       public String getOfficeEmail() {  

           return officeEmail;  

       }  

       public void setOfficeEmail(String officeEmail) {  

           this.officeEmail = officeEmail;  

       }  

       public Integer getIfDefault() {  

           return ifDefault;  

       }  

       public void setIfDefault(Integer ifDefault) {  

           if(ifDefault==null)  

               ifDefault=0;  

           else  

               this.ifDefault = ifDefault;  

       }  

       @Override  

       public int hashCode() {  

           final int prime = 31;  

           int result = 1;  

           result = prime * result + id;  

           result = prime * result  

                   + ((ifDefault == null) ? 0 : ifDefault.hashCode());  

           result = prime * result  

                   + ((mobilePhone1 == null) ? 0 : mobilePhone1.hashCode());  

           result = prime * result  

                   + ((officeEmail == null) ? 0 : officeEmail.hashCode());  

           result = prime * result  

                   + ((officePhone == null) ? 0 : officePhone.hashCode());  

           result = prime * result  

                   + ((username == null) ? 0 : username.hashCode());  

           return result;  

       }  

       @Override  

       public boolean equals(Object obj) {  

           if (this == obj)  

               return true;  

           if (obj == null)  

               return false;  

           if (getClass() != obj.getClass())  

               return false;  

           StationUser other = (StationUser) obj;  

           if (id != other.id)  

               return false;  

           if (ifDefault == null) {  

               if (other.ifDefault != null)  

                   return false;  

           } else if (!ifDefault.equals(other.ifDefault))  

               return false;  

           if (mobilePhone1 == null) {  

               if (other.mobilePhone1 != null)  

                   return false;  

           } else if (!mobilePhone1.equals(other.mobilePhone1))  

               return false;  

           if (officeEmail == null) {  

               if (other.officeEmail != null)  

                   return false;  

           } else if (!officeEmail.equals(other.officeEmail))  

               return false;  

           if (officePhone == null) {  

               if (other.officePhone != null)  

                   return false;  

           } else if (!officePhone.equals(other.officePhone))  

               return false;  

           if (username == null) {  

               if (other.username != null)  

                   return false;  

           } else if (!username.equals(other.username))  

               return false;  

           return true;  

       }  

       @Override  

       public String toString() {  

           return "StationUser [id=" + id + ", username=" + username  

                   + ", officePhone=" + officePhone + ", mobilePhone1="  

                   + mobilePhone1 + ", officeEmail=" + officeEmail  

                   + ", ifDefault=" + ifDefault + "]";  

       }  

         

      Hibernate hql 查詢指定欄位並獲取結果集   

     

     

     

   }  

 

 

[java] view plaincopy

 

   @Override  

       public PageResponse<User> getUserListByStationId(int currentPage,  

               int rowsPerPage, String sidx, String sord, Integer stationId) {  

           StringBuilder hql = new StringBuilder();  

           hql.append("select new com.hp.ts.bca.user.bo.StationUser(a.id,a.username,a.officePhone,a.mobilePhone1,a.officeEmail,ug.ifDefault) FROM User a, UserGroup ug WHERE a.id=ug.userId and ug.groupId=");  

           hql.append(stationId);  

           //hql.append("FROM User AS user, UserGroup AS ug WHERE user.id=ug.userId");  

           PageResponse<User> userList = this.groupDao.excutePage(hql.toString(),  

                   currentPage, rowsPerPage, sidx, sord);  

           return userList;  

       }