制作DAO类Comparable类型是一个好习惯

时间:2017-11-15 11:15:07

标签: java excel hibernate comparable

这是我在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 StudentStudent 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异常。

2 个答案:

答案 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。顺便说一句,您总是可以使用查询本身对记录进行排序。