我有一个名为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());
答案 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。