问题
如果id
属于ExamObject
,我需要根据ExamTask
对ExamObject进行排序,并根据questionNumber
进行排序ExamQuestion
{{1} }}。我怎么能这样做?
重要
考试只有一组ExamTask
或ExamQuestion
。换句话说,一个考试不能混合使用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
可以是以下两种类型
ExamTask
扩展ExamObject
ExamQuestion
扩展了ExamObject
并且有一个名为questionNumber
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;
...
答案 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))))