代码之家  ›  专栏  ›  技术社区  ›  Arun Sudhakaran Nagma Firdose

将DAO类设置为可比较类型是一种好做法吗

  •  1
  • Arun Sudhakaran Nagma Firdose  · 技术社区  · 7 年前

    这是我在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 用于存储学生详细信息。即使 ADMAPLN公司 正在进行 Set 属于 大学生 ,只有一条记录 大学生 将出席特定会议 ADMAPLN公司 id (在一个ADMAPLN下,只有一个学生)。

    现在我想把这些表中的一些数据写入 Excel 文件,其记录必须按 registerNo (如果存在),否则使用 身份证件 大学生 . 我们正在使用 XSSFWorkbook 类别低于 org.apache.poi.xssf.usermodel 操作包 擅长 床单 Here 我找到了一种对excel表排序的方法,但我尝试了,并在代码本身中找到了一种方法,使用 Comparable 界面

    这就是我在 阿普尔多克

    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() 中的方法 设置 接口是获取 大学生 注册号 从…起 ADMAPLN公司

    上述比较机制是合适的还是有更好的方法?为什么我要问这个问题,因为当休眠会话关闭时 compareTo 如果我正在访问子表列,那么我将得到 Invocation 例外

    2 回复  |  直到 7 年前
        1
  •  2
  •   Zeromus    7 年前

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

    1-

    即使Admappn有一组学生,也只有一个 学生将出席特定的ADMAPLN

    为什么? 这是你无法控制的事情吗?还是有什么特别的理由在不需要的地方保留一个集合?(同时,我假设 @OneToMany 而不是 @OneToOne

    2-

    这导致子对象被延迟抓取( N、 B 这是一个假设,因为您没有发布有关映射或如何从数据库获取实体的相关代码)。

    这意味着您必须在实体中切换到即时抓取(未推荐),或者在抓取实体时指定它

    3-

    另外,请重构该比较并使用变量

    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();
        }
    }
    

    虽然该比较机制没有问题(如果有空的,则null指针除外) Set 在查询时,您应该使用数据库排序。

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

        2
  •  0
  •   Har Krishan    7 年前

    在关闭会话之前,需要加载整个对象树,否则会出现异常。顺便说一句,您可以始终使用查询本身对记录进行排序。