2012-01-08 4 views
0

У меня есть несколько сущностей-сущностей с наборами других объектов в качестве атрибутов. Я хочу сортировать их и гарантировать, что при каждой вставке они будут отсортированы. Я попробовал этот путь:Как сортировать объекты JPA с помощью TreeSet

@Entity 
@Table(name = "Document") 
public class Document implements Serializable, Comparable<Document> { 

    ... 

    @ManyToOne 
    private Project relativeProject; 

    ... 

    @Override 
    public int compareTo(Document d) { 
     long data1 = getDate().getTimeInMillis(); 
     long data2 = d.getDate().getTimeInMillis(); 
     if(data1 > data2) 
      return 1; 
     else 
      if(data2 < data1) 
       return -1; 
      else 
       return 0; 
    } 

    @Override 
    public boolean equals(Object d) { 
     return (getIdDocument() == ((Document)d).getIdDocument()); 
    } 

    @Override 
    public int hashCode() { 
     return Long.valueOf(getIdDocument()).hashCode(); 
    } 

} 




@Entity 
@Table(name="Project") 
public class Project implements Serializable, Comparable<Project> { 

    ... 

    @OneToMany(mappedBy="relativeProject", fetch = FetchType.EAGER) 
    @Sort(type = SortType.NATURAL) 
    private SortedSet<Document> formedByDocuments; 

    public Progetto() { 
     this.formedByDocuments = new TreeSet<Document>(); 
    } 

    ... 

} 

Но это не работает. Проблема в том, что даже если в базе данных есть все необходимые записи, когда сеансовый компонент возвращает Project, пропустит около Document. Более того, записи не сортируются вообще в базе данных.
Если я вообще не сортирую (используя HashSet) и переиздаю проект, все работает отлично, и я получаю все элементы в наборе (но не отсортированные, конечно).
Может кто-нибудь помочь мне узнать, что случилось с моей сортировкой?

+1

Небольшое примечание, но вы можете использовать английские имена в своем коде. Это значительно облегчает обмен вашим кодом с другими (например, здесь). Когда я читаю такие вещи, как «progettoRelativo», это похоже на то, что вы запутали код. Вы могли бы также поставить «jkgdklgflkg». Я думаю, что многие другие чувствуют то же самое, и это может снизить ваши шансы получить хорошие ответы. –

+0

Извините, я знаю. Я думал, что все еще ясно (Documento -> Document, Progetto -> Project), но я не думал, что есть и более сложные слова. – Simon

+0

Отправьте свой метод equals() и hashCode() для документа, а также – Andre

ответ

1

Я предполагаю, что getIdDocument() возвращает объект, а не примитив.

В этом случае вам нужно использовать, а не равные ==

public boolean equals(Object d) { 
    return (getIdDocument().equals((Document)d).getIdDocument()); 
} 

Edit:

Похоже, проблема во втором if(data2 < data1) постановки методы CompareTo(). Это должно быть if(data1 < data2)

+0

Это 'long', поэтому' == 'отлично. Во всяком случае, я решил написать: 'if (data1> data2) return 1; else return -1; 'in' compareTo() '. Но я не понимаю, почему. – Simon

+1

Что делать, если вы упростите compareTo()? 'return getDate(). CompareTo (d.getDate());' – Andre

+0

Все еще работает. Однако я не понимаю, почему мое «ручное» сравнение двух дат не сработало. – Simon

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