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

问题描述 投票:1回答:2

这是我在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有一个SetStudent,只有一个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异常。

java excel hibernate comparable
2个回答
2
投票

这里有一些值得讨论的事情:

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)你应该在查询时使用数据库排序。

如果您仍想比较这种方式,您只需确保在关闭会话之前获得所需的所有内容。


0
投票

您需要在关闭会话之前加载整个对象树,否则您将获得Exception。顺便说一下,您总是可以使用查询本身对记录进行排序。

© www.soinside.com 2019 - 2024. All rights reserved.