2013-11-22 2 views
1

У меня есть класс MyClass, который хранит набор объектов-учеников в качестве члена.Как получить последнюю запись, добавленную в набор?

В настоящее время я могу передать идентификатор требуемого ученика и получить объект, но не знаю, как получить последнего, кто был добавлен.

Мне интересно, как я могу изменить код для извлечения объекта последнего ученика, который был добавлен в класс?

«Я знаю, что набор не поддерживает порядок, есть ли способ получить последнюю версию с помощью спящего режима или путем сравнения членов зарегистрированного класса студента?»

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 можно заказать одним из двух способов: с помощью @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 , В противном случае вы можете указать Comparator для обработки сортировки.

Hibernate обеспечит сортировку Set, пройденного.Если мы предположим, этот комплект реализует NavigableSet Interface (и вам нужно будет проверить это), то вы можете использовать методы этого интерфейса, чтобы найти последние:

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

Обратите внимание, что если имеется большое количество студенты, и вы только хотели получить самое последнее, то это не оптимальное решение, так как все ученики будут загружены.

0

Set не поддерживает порядок, вы можете попробовать другие коллекции, такие как LinkedHashSet, который хранит элементы в порядке вставки или PriorityQueue, который обеспечивает доступ с обоих концов.

+0

вопрос обновляется – J888

1

при условии, что id из student является auto increment вы можете использовать TreeSet так, что в последнее время Student будет самый правый элемент в TreeSet (написать compareTo() на вершине id) .Вы можете использовать last() из TreeSet, который даст вам последний.

Даже вместо id вы можете использовать все, что восходящий порядок (написать СотрагеТо() соответственно), и положить student в TreeSet и принести last() т.е. недавнего student объекта.

Надеюсь, это поможет.

+0

я изменил его на TreeSet, но она возвращает суровыми: org.hibernate.AnnotationException: Незаконная попытка сопоставить неофициальный сбор в виде @ OneToMany, @ ManyToMany или @ CollectionOfElements – J888

+0

@ J888 вам придется реализовать Сопоставимые для Студент и переопределить метод compareTo(). – Trying

+0

, но ошибка исходит из спящего режима, который не рассматривает его как коллекцию. – J888

Смежные вопросы