1. 程式人生 > >Hibernate查詢結果排序

Hibernate查詢結果排序

1.對於一般的查詢排序,可以使用HQL語句,例:

Student類有兩個屬性id和name,對應表中的欄位分別為id和NName;查詢表中的所有記錄並按name升序排序

 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());
			}
注意:此處的"name"為Student的屬性,也可為NName欄位名。"order by name asc"   Hibernate會按照Student.hbm.xml對映檔案將其轉換為屬性對應的欄位名NName。

2.在查詢物件的Set、Map等屬性時也可以對其進行排序,可以分為兩個層次:資料庫排序記憶體排序

(1)資料庫排序指的就是由資料庫將查詢的記錄排好序,然後再返回給我們,即排序由資料庫完成。

在<set>等元素中有一個order-by屬性可以設定排序規則,例:(以hibernate對映Map中的Team和Student為例,Team與Student為一對多關聯關係)

只需在Team.hbm.xml的<map>中設定order-by的屬性值即可:

	<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>
對於一對多中的<set>、<List>等也是如此。

注意:(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