Java通过与不同子对象类型的一对多关系进行排序

时间:2015-04-19 13:14:49

标签: java spring hibernate jpa spring-data

问题

如果id属于ExamObject,我需要根据ExamTask对ExamObject进行排序,并根据questionNumber进行排序ExamQuestion {{1} }}。我怎么能这样做?

重要

考试只有一组ExamTaskExamQuestion。换句话说,一个考试不能混合使用ExamTask和ExamQuestion。

背景资料

我有一个名为Exam的实体类。此类可以包含一个或多个ExamObject个实体。

@Entity
public class Exam {
   @OneToMany(mappedBy = "exam" ...)
   @OrderBy("id") //I need to order this by question number if its ExamQuestion
   private Set<ExamObject> objects;
   ...
}
使用ExamObject

JOINED可以是以下两种类型

  1. ExamTask扩展ExamObject
  2. ExamQuestion扩展了ExamObject并且有一个名为questionNumber
  3. 的列

    ExamObject

    @Entity
    @Inheritance(strategy = InheritanceType.JOINED)
    public class ExamObject {    
        @Id
        private Long id;
        ...
    

    ExamTask

    @Entity
    @PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id")
    public class ExamTask extends ExamObject{
       ...
    

    ExamQuestion

    @Entity
    @PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id")
    public class ExamQuestion extends ExamObject{
       @Column(name = "question_number")
       private Integer questionNumber;
       ...
    

3 个答案:

答案 0 :(得分:2)

通过将该集声明为类型TreeSet并向构造函数提供Comparator,插入的项目将自动排序。

new TreeSet<ExamObject>(new Comparator<ExamObject>(){

    @Override
    public int compare(ExamObject a, ExamObject b){
        int q1 = 0, q2 = 0;
        if(a instanceof ExamQuestion){
            q1 = ((ExamQuestion)a).questionNumber;
            if(b instanceof ExamQuestion){
                q2 = ((ExamQuestion)b).questionNumber;
            }else{
                q2 = ((ExamTask)b).id;
            }
        }else{
            q1 = ((ExamTask)a).id;
            if(b instanceof ExamQuestion){
                q2 = ((ExamQuestion)b).questionNumber;
            }else{
                q2 = ((ExamTask)b).id;
            }
        }
        if(q1 == q2) return 0;
        else return q1 < q2  ? -1 : 1;
    }
});

答案 1 :(得分:1)

我相信您的问题是您在实体中使用了Set。套装不会维持秩序。加载您的关系后,该集合将无法保证插入顺序。请尝试使用List。列表将保持插入顺序。

@Entity
public class Exam {
   @OneToMany(mappedBy = "exam" ...)
   @OrderBy("id") //I need to order this by question number if its ExamQuestion
   private List<ExamObject> objects;
   ...
}

希望有所帮助。

答案 2 :(得分:0)

我将@OrderBy与Set一起使用,效果很好。

                 (0 (return-from binsearch m))
                 (1 (binsearch (ls fpred m (+ m (floor (- m l) 2)))))))
 (binsearch ls fpred 0 l))))