如何使用TreeSet对JPA实体进行排序

时间:2012-01-08 15:34:49

标签: sorting java-ee jpa set ejb-3.0

我有几个实体bean,其他实体集作为属性。我想对它们进行排序并保证在每次插入时它们都会保持排序状态。 我试过这种方式:

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

    ...

}

但它不起作用。问题在于,即使在数据库中存在所有需要的条目,当会话bean返回Project时,也会遗漏一些Document。而且,数据库中的条目根本没有排序。
如果我根本不排序(使用HashSet)并重新发布项目,一切正常,我得到一组中的所有元素(当然没有排序)。
有人可以帮我找出我的排序有什么问题吗?

1 个答案:

答案 0 :(得分:1)

我假设getIdDocument()返回一个对象而不是一个原语。

在这种情况下,您需要使用equals而不是==

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

修改

看起来问题出在compareTo()方法的第二个if(data2 < data1)语句中。这应该是if(data1 < data2)