2013-11-22 96 views
1

我有一個名爲MyClass的類,它將一組學生對象保存爲成員。如何檢索已添加到集合的最新記錄?

目前我可以通過所需學生的ID和檢索對象,但不知道如何檢索已添加的最新的一個。

我想知道如何更改代碼來檢索添加到類中的最後一個學生的對象?

「我知道set不會維護順序,是否有任何方法可以使用hibernate或通過比較學生類的enrolledDate成員來檢索最新的一個?

MyClass的

import java.util.Set 

@Entity 
public class MyClass { 

    @Id 
    @GeneratedValue 
    private long id; 

    @OneToMany 
    @LazyCollection(LazyCollectionOption.FALSE) 
    private Set<Student> students; 

    .... 
} 

Student類

@Entity 
public class Student { 

    @Id 
    @GeneratedValue 
    private long id; 

    private String name; 

    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date enrolledDate; //I may need to use this date as it is enrollment date but not sure how to retrieve the latest one. 
} 

Hibernate代碼

MyClass myClass = (MyClass) session.get(MyClass.class, id); 

Iterator<MyClass> it = myClass.getStudents().iterator(); 

Student stu = new Student(); 

while (it.hasNext()) { 
      stu = it.next(); 
      if (stu.getId() == stuId) { 
         break; 
      } 
} 

System.err.println("Student name is:" + stu.getName()); 

回答

1

好吧Hibernate中的Set(或者其他一些集合)可以通過兩種方式之一進行排序:使用@Sort(內存中排序)或使用@OrderBy(數據庫排序)。

由於@OrderBy不能用於嵌套屬性(例如myclass.student.dateEnrolled),因此您需要使用@Sort。

http://docs.jboss.org/hibernate/core/3.5/javadocs/org/hibernate/annotations/Sort.html

http://eubauer.de/kingsware/2011/03/15/ordering-collections-with-jpa/

所有你需要做的就是:

@OneToMany 
@Sort(...) 
private Set<Student> students; //note leave as Set 

如果集合類型實現可比,這是你想要的,你可以指定SortType.NATURAL訂單。否則,您可以指定一個比較器來處理排序。

Hibernate將確保Set傳入進行排序。如果我們假設這個設置實現NavigableSet接口(和你需要檢查這一點),那麼你可以使用該接口的方法來找到最新:

http://docs.oracle.com/javase/6/docs/api/java/util/NavigableSet.html

需要注意的是,如果有大量學生和你只想要最新的,那麼這是一個次優的解決方案,因爲所有的學生將被加載。

0

集合不維護訂單,您可以嘗試其他集合,如LinkedHashSet(以插入順序存儲元素)或PriorityQueue(提供兩端訪問)。

+0

問題是更新 – J888

1

假設的studentidauto increment您可以使用TreeSet,使近期Student將最右邊的元素在TreeSet(上id上面寫着你的compareTo())。你可以使用TreeSetlast(),這將給你的最新。

的即使不是id你可以使用任何爲升序(寫的compareTo()相應),並把studentTreeSet並獲取last()即最近student對象。

希望它有幫助。

+0

我改成了TreeSet的,但它返回重度:org.hibernate.AnnotationException:非法嘗試映射非集合爲@一對多,多對多@或@ CollectionOfElements – J888

+0

@ J888你將不得不實施具有可比性學生並重寫compareTo()方法。 – Trying

+0

,但是錯誤來自休眠,它並不認爲它是一個集合。 – J888

相關問題