这是我在休眠状态下的示例映射
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
这导致子对象beig lazy延迟获取(注:这是一个假设,因为您没有发布有关映射或从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除外),但在查询时应使用数据库排序。如果您仍想以这种方式进行比较,则只需确保在关闭会话之前已获取所有需要的内容。