在使用hibernate進行查詢時,使用得最多的仍是經過構建hql進行查詢了。在查詢的過程中,除使用常常的查詢對象方法以外,還會遇到查詢一個屬性,或一組彙集結果的狀況。在這種狀況下,咱們一般就須要對返回的結構進行處理。
通常狀況下,咱們經過構建hql,並經過設置query的resultTransformer來定製返回結果的類型,通常設置爲map屬性,以下所示:mysql
Query query = session.createQuery("hql");?sql
query.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);數據庫
來指定查詢結果的每一項爲一個map。
不過,隨着hibernate的發展,能夠在hql中直接使用集合查詢語句,如list和map了。如下分別介紹使用List和Map時的查詢語句以及查詢結果。首先,數據庫的數據以下所示:session
mysql> select * from p_dictionary;函數
+-----------------+----+---------+------+--------+--------+spa
| dictionary_type | id | version | code | forbid | value |hibernate
+-----------------+----+---------+------+--------+--------+code
| COUNTY | 1 | 0 | 001 | | 四川 |orm
| COUNTY | 2 | 0 | 002 | | 北京 |對象
| COUNTY | 3 | 0 | 001 | NULL | 四川 |
+-----------------+----+---------+------+--------+--------+
3 rows in set (0.00 sec)
如下分別介紹使用list和map的查詢語句和查詢結果:
使用List
String query = "select new List(p.code, p.value) from Dictionary p";
List list = session.createQuery(query).list();
System.out.println(list);
//結果: [[001, 四川],[002,北京],[001,四川]]
?
使用Map,首先不指定alias,則結果的鍵就按照查詢出來的順序結果,使用0,1來表示key
String query = "select new Map(p.code, p.value) from Dictionary p";
List list = session.createQuery(query).list();
//結果:[{1=四川, 0=001},{1=北京, 0=002},{1=四川, 0=001}]
?
使用Map,指定alias,則結果中的key則爲alias
String query = "select new Map(p.code as code, p.value as value) from Dictionary p";
List list = session.createQuery(query).list();
//結果:[{value=四川, code=001},{value=北京, code=002},{value=四川, code=001}]
?
若是部分使用alias,部分不使用,則使用了alias的將使用alias做爲key,沒有使用的則仍然使用序號代替,其中序號則爲在查詢結果的序號
String query = "select new Map(p.code as code, p.value) from Dictionary p";
List list = session.createQuery(query).list();
//結果:[{1=四川, code=001},{1=北京, code=002},{1=四川, code=001}]
--------------------------------------------------------------------------------------------------
select new List(p.name, p.address) from Person as p ;
select將選擇出來的屬性存入一個List對象中
select new ClassTest(p.name, p.address) from Person as p;
select將選擇出來的屬性封裝成對象,前提是ClassTest支持p.name, p.address的構造函數,
select new Map(p.name as personName) from Person as p ;select將選中的表達式命名爲別名,這種用法與new Map()結合,選擇出來的是Map結構,以personName爲key,將實際選擇出來的值做爲value