Hibernate查詢結果排序
阿新 • • 發佈:2019-01-27
1.對於一般的查詢排序,可以使用HQL語句,例:
Student類有兩個屬性id和name,對應表中的欄位分別為id和NName;查詢表中的所有記錄並按name升序排序
注意:此處的"name"為Student的屬性,也可為NName欄位名。"order by name asc" Hibernate會按照Student.hbm.xml對映檔案將其轉換為屬性對應的欄位名NName。Query q=session.createQuery("from Student order by name asc"); List<Student> li=(List<Student>)q.list(); for (int i = 0; i < li.size(); i++) { System.out.println(li.get(i).getName()); }
2.在查詢物件的Set、Map等屬性時也可以對其進行排序,可以分為兩個層次:資料庫排序和記憶體排序:
(1)資料庫排序指的就是由資料庫將查詢的記錄排好序,然後再返回給我們,即排序由資料庫完成。
在<set>等元素中有一個order-by屬性可以設定排序規則,例:(以hibernate對映Map中的Team和Student為例,Team與Student為一對多關聯關係)
只需在Team.hbm.xml的<map>中設定order-by的屬性值即可:
對於一對多中的<set>、<List>等也是如此。<class name="bean.Team" table="team"> <id name="id" column="id" type="long"> <generator class="increment"></generator> </id> <property name="name" column="name" type="string"></property> <map name="students" table="students" cascade="save-update" order-by="name asc"> <key column="team_id"></key> <index column="cardID" type="long"></index> <one-to-many class="bean.Student"/> </map> </class>
注意:(1)此處的"name"是資料庫裡的欄位而不是類的屬性。
(2)對於多對多對映關係,order-by中指定的欄位是連線表中的欄位而不是與其關聯的表的欄位,以hibernate多對多雙向關聯中的Student和Course為例:
如在Student.hbm.xml中的<set>中設定order-by屬性指定排序規則:
<set name="courses" table="students_courses" cascade="save-update" order-by="course_id desc" >
連線表為students_courses,course_id為連線表中的欄位(即連線表參照course表id的外來鍵)
(2)記憶體排序指的就是從資料庫將資料查出放入到記憶體中後再由Hibernate按照指定的排序規則進行排序。
記憶體排序:有兩個屬性值可以直接使用,分別是unsorted(不排序)以及natural(自然排序,即升序),此外,我們還可以自定義排序規則,方式是定義一個類,讓其實現Comparator介面,並且實現該介面中的compare方法,在該方法中實現排序規則即可。然後將該自定義排序規則的類名作為sort的屬性值即可。例:在Team.hbm.xml中的<map>設定sort屬性值指定排序規則為自然排序:
<map name="students" table="students" cascade="save-update" sort="natural">
自定義排序規則類MyComparator(實現Comparator介面),然後作為sort的屬性值即可:<map name="students" table="students" cascade="save-update" sort="hibernate.MyComparator">
轉載請註明出處:http://blog.csdn.net/jialinqiang/article/details/8700713