在hibernate中查詢使用List,Map和類對象定製返回類型

在使用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

相關文章
相關標籤/搜索