这是我在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
的{{1}} Set
Student
,Student
AdmAppln
只有一个id
的记录。 AdmAppln只有一个学生。)
现在我想把这些表中的少量数据写入Excel
文件,其记录必须按registerNo
(如果存在)的顺序排序,否则使用{{1 } id
。我们在Student
包下使用XSSFWorkbook
类来对org.apache.poi.xssf.usermodel
表进行操作。 Here我找到了一种对Excel工作表进行排序的方法,但我尝试使用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
的唯一方法是转换它到列表。然后我对列表进行了排序,然后迭代生成excel文件。
上述比较机制是正确的还是有更好的方法?为什么我要问这个问题,因为当Hibernate会话关闭时,如果我访问子表列,我的AdmAppln
就会出现compareTo
异常。
答案 0 :(得分:2)
这里有一些值得讨论的事情:
1 -
即使AdmAppln有一套学生,也只有一个记录 学生将出席特定的AdmAppln
为什么呢?
这是你无法控制的东西,还是有任何特别的理由让一套不需要的地方? (我也假设@OneToMany
代替@OneToOne
映射)
2 -
这会导致子对象beig lazy fetched( 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)你应该在查询时使用数据库排序。
如果您仍想比较这种方式,您只需确保在关闭会话之前获得所需的所有内容。
答案 1 :(得分:0)
您需要在关闭会话之前加载整个对象树,否则您将获得Exception。顺便说一句,您总是可以使用查询本身对记录进行排序。