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(即相關聯的欄位)
例如要查詢Problem 中的pid,score,title,totalAccept,totalSubmission,unSee
關於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如下:
- 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,程式碼如下:
- 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"
- Query q = factory.getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(PostVO.class));
紅字部分必須跟PostVO中的屬性一直,這樣就可以返回一個針對PostVO的一個集合。
其實大家可以看下hibernate這一部分的原始碼就會發現,主要是使用了AliasToBeanResultTransformer這個類,通過sql的查詢,會返回陣列,然後hibernate根據資料表的對映,自動幫我們來set對應的欄位屬性,所以標紅的部分務必要跟VO中的屬性值一直,要不然會報錯的。
如果需要的話,大家也可以重寫這個類。例如VOResultTransformer。然後在dao中更改成
- setResultTransformer(new VOResultTransformer(PostVO.class));
即可。
-
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中封
hibernate用hql怎麼查詢某個欄位
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 替代值