hibernate提供了兩種排序方式:1:數據庫排序,也就是說通過SQL語句在數據庫內部就進行完了排序。2.內存排序,也就是說在數據庫中把數據加載到內存中后在進行排序。推薦使用第一種排序方式,因為在數據庫中排序的性能要遠遠高於在內存中排序的性能。
一:數據庫排序
使用集合標簽中的order-by屬性,格式主要是為: order-by="字段名 排序方式”;例如:order-by="name ASC” name是指數據庫字段 ASC是升序(默認值,可以省略)、DESC是降序。在hibernate中,<set>、<idbag>、<map>、<list>元素都有order-by屬性,如果設置了該屬性,Hibernate會利用 order by 子句進行排序,使用order-by屬性,我們可以通過hbm文件執行生成的SQL如何使用orderby 查詢子句以返回排序后的結果集。下面我們就以一個具體的實例來具體看一下數據庫排序的內容
<set name="students" table="studentOrder" order-by="name desc">
二.內存排序
內存排序,顧名思義,就是在內存中排序,把查詢到得結果加載到內存以后驚醒排序。Hibernate在配置文件中也給我提供了內存排序的配置,那就是sort屬性,它有兩個屬性值可以直接使用,分別是unsorted(不排序)以及natural(自然排序,即升序),此外,我們還可以自定義排序規則,方式是定義一個類,讓其實現Comparator接口,並且實現該接口中的compare方法,在該方法中實現排序規則即可。然后將該自定義排序規則的類名作為sort的屬性值即可。<set>和<map>元素都具有sort屬性,如果設置了該屬性,就會對內存中的集合對象進行排序。
<set>元素的sort屬性為natural,表示對集合中的字符串進行自然排序。Hibernate采用org.hibernate.PersistentSortedSet作為Set的實現類,PersistentSortedSet類實現了 java.util.SortedSet接口。當Session保存一個對象時,會調用 org.hibernate.type.SortedSetType類的wrap()方法,把對象的集合屬性包裝為 SortedSet類的實例,下面我們看一下wrap()方法的源代碼如下:
public PersistentCollection wrap (SessionImplementor session, Object collection) { return new PersistentSortedSet(session, (java.util.SortedSet) collection ); }
從wrap()方法的源代碼看出,應用程序中創建的對象的集合屬性必須是java.util.SortedSet類型,否則以上wrap()方法會拋出ClassCastException。
其實內存排序和數據庫排序是一樣的,只是配置的參數不同而已,都是在集合標簽配置一下,所以在此我們就不以示例演示了。
從wrap()方法的源代碼看出,應用程序中創建的對象的集合屬性必須是java.util.SortedSet類型,否則以上wrap()方法會拋出ClassCastException。
其實內存排序和數據庫排序是一樣的,只是配置的參數不同而已,都是在集合標簽配置一下,所以在此我們就不以示例演示了。
