这是我在休眠状态下的示例映射

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用于存储学生详细信息。即使AdmApplnSetStudent,对于特定的Student AdmAppln也仅显示id一条记录(在一个AdmAppln中只有一名学生)。

现在,我想将这些表中的少量数据写入一个Excel文件,该文件的记录必须按registerNo的顺序排序(如果存在),否则使用idStudent。我们正在使用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获取registerNoAdmAppln的唯一方法是将其转换为列表。然后我对列表进行排序,然后对其进行迭代以生成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除外),但在查询时应使用数据库排序。

如果您仍想以这种方式进行比较,则只需确保在关闭会话之前已获取所有需要的内容。

08-07 05:55