这是我在hibernate中的示例映射
class ApplnDoc {
AdmAppln admAppln;
// getters and setters
}
class AdmAppln {
Set<Student> student;
// getters and setters
}
class Student {
int id;
String registerNo;
AdmAppln admAppln;
// getters and setters
}
在ApplnDoc
表中,我们存储了所有候选人的图像。 AdmAppln
用于存储入场详情,Student
用于存储学生详细信息。即使AdmAppln
有一个Set
的Student
,只有一个Student
记录将出现在特定的AdmAppln
id
(在一个AdmAppln只有一个学生)。
现在我想把这些表中的一些数据写入一个Excel
文件,其记录必须按照registerNo
(如果存在)的顺序排序,否则使用id
的Student
。我们在XSSFWorkbook
包下使用org.apache.poi.xssf.usermodel
类在Excel
表上进行操作。 Here我找到了一种对excel表进行排序的方法,但我尝试使用Comparable
接口在代码中找到了一种方法。
这就是我在ApplnDoc
课上所做的
public int compareTo(ApplnDoc otherData) {
if(new ArrayList<Student>(this.admAppln.getStudents()).get(0).getRegisterNo() != null &&
!new ArrayList<Student>(this.admAppln.getStudents()).get(0).getRegisterNo().isEmpty() &&
new ArrayList<Student>(otherData.admAppln.getStudents()).get(0).getRegisterNo() != null &&
!new ArrayList<Student>(otherData.admAppln.getStudents()).get(0).getRegisterNo().isEmpty()) {
return new ArrayList<Student>(this.admAppln.getStudents()).get(0).getRegisterNo()
.compareTo
(new ArrayList<Student>(otherData.admAppln.getStudents()).get(0).getRegisterNo());
} else {
return new ArrayList<Student>(this.admAppln.getStudents()).get(0).getId() -
new ArrayList<Student>(otherData.admAppln.getStudents()).get(0).getId();
}
}
由于在get()
界面中没有Set
方法,从Student
获得registerNo
的AdmAppln
的唯一方法是将其转换为列表。然后我对列表进行了排序,然后迭代生成excel文件。
上面提到的比较机制是正确的还是有更好的方法?为什么我问这个问题,因为当Hibernate会话关闭时,如果我访问子表列,我的compareTo
,那么我将获得Invocation
异常。
这里有一些值得讨论的事情:
1-
即使AdmAppln有一套学生,也只有一个学生的记录会出现在特定的AdmAppln上
为什么?这是你无法控制的东西,还是有任何特别的理由让一套不需要的地方? (也是我假设@OneToMany
而不是@OneToOne
映射)
2-
这导致子对象被提取延迟(N.B这是一个假设,因为您没有发布有关映射的相关代码或如何从db获取实体)。
这意味着您必须切换到实体中的预先获取(未推荐)或在获取实体时指定它
3-
还请重构compareTo并使用变量
public int compareTo(ApplnDoc otherData) {
Student thisStudent = new ArrayList<>(this.admAppln.getStudents()).get(0);
Student otherStudent = new ArrayList<>(otherData.admAppln.getStudents()).get(0);
if(thisStudent.getRegisterNo() != null &&
!thisStudent.getRegisterNo().isEmpty() &&
otherStudent.getRegisterNo() != null &&
!otherStudent.getRegisterNo().isEmpty()) {
return thisStudent.getRegisterNo().compareTo(otherStudent.getRegisterNo());
} else {
return thisStudent.getId() - otherStudent.getId();
}
}
虽然这种比较机制没有任何问题(如果你有一个空的Set
学生,除了NullPointer)你应该在查询时使用数据库排序。
如果您仍想比较这种方式,您只需确保在关闭会话之前获得所需的所有内容。
您需要在关闭会话之前加载整个对象树,否则您将获得Exception。顺便说一下,您总是可以使用查询本身对记录进行排序。