1. 程式人生 > >hibernate用hql怎麼查詢某個欄位

hibernate用hql怎麼查詢某個欄位

List results = session.find("select count(*), avg(user.age) from User as user");

ListIterator iterator = results.listIterator();

Object[] rows = (Object[]) iterator.next();

System.out.println("資料筆數: " + rows[0] + "\n平均年齡: " + rows[1]);

在hibernate中,用hql語句查詢實體類,採用list方法的返回結果為一個List,該List中封裝的物件分為以下三種情況:
1.查詢全部欄位的情況下,如"from 實體類",list中封裝的物件為實體類本身,各屬性都將得到填充。
2.只查詢一個欄位,預設情況下,list中封裝的是Object物件。

3.查詢兩個或兩個以上的欄位,預設情況下,list中封裝的是Object[],長度與所查詢的欄位數一致。

對於後兩種情況,用標籤遍歷時不太方便,因為無法直接轉換成實體類的物件。比較簡單的解決方法是:

の:在hql中使用select new 包名.類名(屬性1,屬性2……) from 實體類,同時在實體類中新增帶參的構造方法,引數的個數和順序與(屬性1,屬性2……) 保持一致,這樣我們得到的list中存放的依然是實體類的物件,所查詢到的屬性得到了填充,使用起來更為方便。

  の:hql查詢多表部分欄位,select new 包名.表1實體類名(表1.屬性1,表2.屬性2……) from 表1實體類,表2實體類 where 表1.ID=表2.ID(即相關聯的欄位)

,同時在要返回的表1實體類中新增表2的屬性和帶參的構造方法,引數的個數和順序與(表1.屬性1,表2.屬性 2……) 保持一致

例如要查詢Problem 中的pid,score,title,totalAccept,totalSubmission,unSee

public class Problem {       private int pid;       private int score;       private int timeLimit;       private int memoryLimit;       private int totalAccept;       private int totalSubmission;       private int unSee;       private String title;       private String description;       private String input;       private String output;       public Problem(int pid, int score,String title, int totalAccept, int totalSubmission,                int unSee) {           super();           this.pid = pid;           this.score = score;           this.totalAccept = totalAccept;           this.totalSubmission = totalSubmission;           this.unSee = unSee;           this.title = title;       }       //省略getter 和 setter    }   查詢語句如下       Query query=session.createQuery("select new Problem(pid,score,title,totalAccept,totalSubmission,unSee) from Problem order by pid");           //query.setFirstResult(firstResult); //分頁函式            //query.setMaxResults(maxResutl);            List<Problem> problems=query.list();//返回的還是Problem物件 









關於hibernate的問題: 

我現在有條 
hql="select s.id,s.name,t.id,t.name from User s,Useraddress t where t.id=s.id" 

這條sql裡面的User和Useraddress是兩個實體類,現在組合查詢分別取出來兩個實體類裡面的兩個欄位,然後我想再建立一個實體類Result,裡面定義這四個結果集裡面的欄位,能不能執行完這條hql,正好把這個結果集對應到實體類Result裡面呢,Result這個實體類,沒寫對映檔案Result.hbm.xml. 
希望能幫下忙 

2種做法 
建立一個class temp 
有屬性sid,name,tid,sname,tname 
建立一個建構函式 
public temp(sid,name,tid,sname,tname) 



1.hql中 
List<temp> 

select new temp(s.id,s.name,t.id,t.name) from User s,Useraddress t where t.id=s.id 

2.List 
記錄的每一行是object[] 遍歷 
object[0] ==s.id 
object[1] ==s.name 
object[2] ==t.id 
object[3] ==t.name 

如下:

   相信用過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程式碼  收藏程式碼
  1. public class PostVO{

        private String username;

        private int usercount;

        public PostVO(String username, int usercount) {
            super();
            this.username = username;
            this.usercount = usercount;
        }


        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public int getUsercount() {
            return usercount;
        }

        public void setUsercount(int usercount) {
            this.usercount = usercount;
        }

    }


相關推薦

Hibernate中用hql查詢部分

在hibernate中,用hql語句查詢實體類,採用list方法的返回結果為一個List,該List中封裝的物件分為以下三種情況: 1.查詢全部欄位的情況下,如"from 實體類",list中封裝的物件為實體類本身,各屬性都將得到填充。 2.只查詢一個欄位,預設情況下

Hibernate中用hql查詢部分 可解決異常java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to

hql查詢單表部分欄位: 在hibernate中,用hql語句查詢實體類,採用list方法的返回結果為一個List,該List中封裝的物件分為以下三種情況: 1.查詢全部欄位的情況下,如"from 實體類",list中封裝的物件為實體類本身,各屬性都將得到填充。 2.只查詢一個欄位,預設情況下,list中封

hibernatehql怎麼查詢某個

List results = session.find("select count(*), avg(user.age) from User as user"); ListIterator iterator = results.listIterator(); Object

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

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

查詢MDB中高程點的高程值有0值的圖幅(遊標遍歷查詢某個的值),並將查到的結果寫入到TXT中

1、 mdbs = arcpy.ListWorkspaces("*","Access") 2、 FeatureClasses = arcpy.ListFeatureClasses() 3、 Fields = arcpy.ListFields(FeatureClass) 4、 cursor =

hibernate hql 查詢指定並獲取結果集,多表查詢結果集

原文轉自:http://blog.csdn.net/ljfbest/article/details/7472042在hibernate中,用hql語句查詢實體類,採用list方法的返回結果為一個List,該List中封裝的物件分為以下三種情況: 1.查詢全部欄位的情況下,如

Mysql查詢某個出現的次數並按倒序排列

問題:mysql資料庫表名address,查詢城市city欄位出現的次數並按倒序排列   查詢語句 select city,count(*) from address group by city order by count(*)  desc 執行結果如圖,按查詢欄位(城

es:實現查詢某個為固定值,另一個必須不能存在

要求:查詢出 positionName為空,hasJobRequest為1的資料   也可以嘗試用must ,must_not ,exist: {   "query": {     

mysql 查詢某個資訊,由多個id逗號隔開拼裝成

select a.SUPPLIER_USER_ID,GROUP_CONCAT(d.ITEM_NAME) AS countyName from p_supplier_user a LEFT JOIN t

1.怎樣查詢某個在哪個表2.怎樣查詢某個庫中的某個表的全部(快速將實體類與資料庫對應起來)

1.怎樣查詢某個欄位在哪個表 SELECT COLUMN_NAME,TABLE_NAME,TABLE_SCHEMA FROM INFORMATION_SCHEMA.columns WHERE COLUMN_NAME='欄位名'; 上面的這條語句只有我標註成漢字的地方需要替

mysql GROUP_CONCAT 查詢某個(查詢結果預設逗號拼接)

Mysql 的 GROUP_CONCAT 函式預設將查詢的結果用逗號拼接並返回一個字串,如:李四,long,張三 1. 常用方式 2. GROUP_CONCAT 結合 IN 的使用 -- 查詢指定id對應的name值,返回結果為 name7,name4,name

Yii裡查詢某個的最大值和最小值

求某個型別的最大值和最小值 $sql = "SELECT min(欄位) as 自定義1, max(欄位) as 自定義2 FROM article"; $變數 = Yii::app() ->

MongoTemplate查詢指定的正確奧義

這裡舉一個我個人犯的一個錯誤,希望看到此博文的人能避免犯同樣的錯誤: 在CompanyInfo這個類中,它其中包含一個List型別的AccountInfo屬性。然後好戲開始了,我希望通過BasicDB

oracle,查詢某個中,某字元出現的次數

SELECT LENGTHB(TRANSLATE('1,2,34,5',',12345',',')) FROM DUAL;SELECT LENGTHB('1,2,34,5')-LENGTHB(REPL

Mongodb在查詢某個是否存在,執行刪除,python中排序和建立索引

查詢欄位是否存在 查詢course表中,存在lectures_count欄位的記錄資訊 db.course.find( { “lectures.lectures_count”: { $exists: true } } ) 引數:ture或者false 使

Elasticsearch在使用Kibana查詢時,只查詢某個的值的語法

使用 _source 就OK啦: GET a_safe_qyaqyh/_search { "query": { "match": { "QYXX.QYBH": "0000001

SQL Server中查詢某個中長度最短的一列資料

這個需求在查詢和篩選的時候會用到。我們可以看看下面兩種方法,均可。 至於效率問題自行研究試試。 方法一 SELECT top 1 ROW_ID,SPLIT_NO FROM CD_EMP WHERE

hibernate實現查詢某實體的某個的多個值的對應實體列表

在使用hibernate和資料庫互動時,可以是使用hibernate的session的各種操作資料庫方法,在實際使用中也常常結合hbm.xml檔案裡寫好的query執行塊,再通過setParameter方式設定引數後執行查詢獲取結果。其中經常使用的一個場景----hibern

oracle查詢一個表中的一個內容包含另一個表中的某個的值

select *   from table1 where exists (select 1           from table2          where table1.columA like '%' || table2.columB || '%')

SQL 查詢的結果某個是Null,預設的值代替

如果查詢的結果某個欄位是Null,用預設的值代替。 1、)Sql server中: select   case   when   欄位名1   is   null                                  then   替代值