Hibernate對集合排序

luxika發表於2011-04-15
Hibernate對集合中的元素支援兩種排序方式:

Ø 在資料庫中排序:簡稱為資料庫排序,當Hibernate通過select語句到資料庫中檢索集合物件時,利用order by子句進行排序。

Ø 在記憶體中排序:簡稱為記憶體排序,當Hibernate把資料庫中的集合資料載入到記憶體中的Java集合中後,利用Java集合的排序功能進行排序,可以選擇自然排序或者客戶化排序兩種方式。

在對映檔案中,Hibernate用sort屬性來設定記憶體排序,用order-by屬性來設定資料庫排序,表14-2顯示了<set>、<idbag>、<list>和<map>元素的排序屬性。

表14-2 <set>、<idbag>、<list>和<map>元素的排序屬性

排 序 屬 性


[img]http://dl.iteye.com/upload/attachment/463794/4bc0660f-4a17-3c29-b4e4-15de7cde08de.png[/img]


從表14-2看出,<set>和<map>元素支援記憶體排序和資料庫排序,<list>元素不支援任何排序方式,而<idbag>僅支援資料庫排序。
14.5.1 在資料庫中對集合排序

<set>、<idbag>和<map>元素都具有order-by屬性,如果設定了該屬性,當Hibernate通過select語句到資料庫中檢索集合物件時,利用order by子句進行排序。

下面對本章14.1節的Customer.hbm.xml檔案中的<set>元素增加一個order-by屬性:

<set   name="images"   table="IMAGES"    lazy="true" order-by="FILENAME asc">

<key column="CUSTOMER_ID" />

<element column="FILENAME" type="string" not-null="true"/>

</set>


以上程式碼表明對images集合中的元素進行升序排列,當Hibernate載入Customer物件的images集合時,執行的select語句為:

select CUSTOMER_ID,FILENAME from IMAGES

where CUSTOMER_ID=1 order by FILENAME;

在DOS命令列下進入chapter14根目錄,然後輸入命令:

ant -file build1.xml run

就會執行BusinessService類。BusinessService的main()方法呼叫test()方法,它的輸出結果如下:

org.hibernate.collection.PersistentSet

Tom image1.jpg

Tom image2.jpg

Tom image4.jpg

Tom image5.jpg

在order-by屬性中還可以加入SQL函式,例如:

<set name="images" table="IMAGES" lazy="true"

order-by="lower(FILENAME) desc">



<key column="CUSTOMER_ID" />

<element column="FILENAME" type="string" not-null="true"/>

</set>

當Hibernate載入Customer物件的images集合時,執行的select語句為:

select CUSTOMER_ID,FILENAME from IMAGES

where CUSTOMER_ID=1 order by lower(FILENAME) desc;

在<map>元素中也可以加入order-by屬性,以下程式碼表明對Map型別的images集合中的鍵物件進行排序:

<map   name="images"   table="IMAGES"   lazy="true" order-by="IMAGE_NAME">

<key column="CUSTOMER_ID" />

<map-key column="IMAGE_NAME" type="string"/>

<element column="FILENAME" type="string" not-null="true"/>

</map>

以下程式碼表明對Map型別的images集合中的值物件進行排序:

<map name="images" table="IMAGES" lazy="true" order-by="FILENAME">

<key column="CUSTOMER_ID" />

<map-key column="IMAGE_NAME" type="string"/>

<element column="FILENAME" type="string" not-null="true"/>

</map>

在<idbag>元素中也可以加入order-by屬性,以下程式碼表明按照IMAGES表中的ID代理主鍵排序:

<idbag name="images" table="IMAGES" lazy="true" order-by="ID">

<collection-id type="long" column="ID">

<generator class="increment"/>

</collection-id>

<key column="CUSTOMER_ID" />

<element column="FILENAME" type="string" not-null="true"/>

</idbag>

http://book.csdn.net/bookfiles/1264/100126437749.shtml

相關文章