如何检索已添加到集合中的最新记录?

时间:2013-11-22 04:36:36

标签: java hibernate set hibernate-mapping

我有一个名为MyClass的类,它将一组学生对象保存为成员。

目前,我可以传递所需学生的ID并检索该对象,但不知道如何检索已添加的最新学生。

我想知道如何更改代码以检索添加到课程中的最后一个学生的对象?

“我知道set没有维护顺序,是否有任何方法可以使用hibernate或比较学生类的注册日期成员来检索最新版本?”

MyClass的

import java.util.Set

@Entity
public class MyClass {

   @Id
   @GeneratedValue
   private long id;

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

   ....
}

学生班

@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());

3 个答案:

答案 0 :(得分:1)

假设id的{​​{1}}为student,您可以使用auto increment,以便最近的TreeSet成为{{1}中最正确的元素(在Student之上写下您的TreeSet)。您可以使用compareTo() id来提供最新信息。

即使代替last(),您也可以使用升序排序(相应地编写compareTo()),并将TreeSet放入id并获取student即最近{ {1}}对象。

希望它有所帮助。

答案 1 :(得分: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

如果Set中的类型实现Comparable并且这是您想要的Order,则可以指定SortType.NATURAL。否则,您可以指定比较器来处理排序。

Hibernate将确保传入的Set被排序。如果我们假设这个Set实现了NavigableSet接口(你需要检查它),那么你可以使用该接口的方法来找到最新的:

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

请注意,如果有大量学生并且您只想要最新版本,那么这是一个次优解决方案,因为所有学生都将被加载。

答案 2 :(得分:0)

Set不维护订单,您可以尝试其他集合,例如LinkedHashSet,它以插入顺序存储元素或者提供从两端访问的PriorityQueue。