在使用hibernate進行查詢時,使用得最多的還是通過構建hql進行查詢了。在查詢的過程當中,除使用經常的查詢對象方法之外,還會遇到查詢一個屬性,或一組聚集結果的情況。在這種情況下,我們通常就需要對返回的結構進行處理。
一般情況下,我們通過構建hql,並通過設置query的resultTransformer來定製返回結果的類型,一般設置爲map屬性,如下所示:
1 2 | Query query = session.createQuery( "hql" ); query.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP); |
來指定查詢結果的每一項爲一個map。
不過,隨着hibernate的發展,可以在hql中直接使用集合查詢語句,如list和map了。以下分別介紹使用list和map時的查詢語句以及查詢結果。首先,數據庫的數據如下所示:
1 2 3 4 5 6 7 8 9 | mysql> select * from p_dictionary; +-----------------+----+---------+------+--------+--------+ | dictionary_type | id | version | code | forbid | value | +-----------------+----+---------+------+--------+--------+ | COUNTY | 1 | 0 | 001 | | 四川 | | COUNTY | 2 | 0 | 002 | | 北京 | | COUNTY | 3 | 0 | 001 | NULL | 四川 | +-----------------+----+---------+------+--------+--------+ 3 rows in set (0.00 sec) |
以下分別介紹使用list和map的查詢語句和查詢結果:
使用list
1 2 3 4 5 | 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
1 2 3 4 | 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
1 2 3 4 | 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,沒有使用的則仍然使用序號代替,其中序號則爲在查詢結果的序號
1 2 3 4 | 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 }] |
轉自:https://www.iflym.com/index.php/code/use-list-set-map-in-hibernate-query.html