如何实现对 DAO 方法的排序?

How to implement sorting to a DAO method?

这个问题是 3 年前由另一个人在这里提出的,但没有最终答案:Specify Ordering to a DAO Method

我的问题也是如此。我有一个 class Student 和一个实现 DAO 的 class StudentDAOImpl。我如何告诉我的方法 getAll 我希望所有学生按姓名排序,而不将调用者耦合到特定的实现。我想知道有几种方法可以做到这一点,但我想知道最好的做法是什么。

非常感谢您的关注。

public class Student{
    private int id;
    private String name;

    public Student() {
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

}

public class Student{} 

public interface StudentDao{ 
    public LinkedList<Student> getAll(Student s, StudentSortCriterion sortBy); 
} 

public class StudentDaoImpl implements StudentDao{ 
     getAll(...){implementation/SQL Statement}
} 

抽象的看这个,需要传入信息如何排序。这可以通过多种方式设计,但为了简单起见,可以排序的属性直接与学生相关class;那么为什么不为可排序属性定义常量呢?

无论如何,DAO 需要对学生 class 有深入的了解(因为它必须知道如何创建它们),因此它可以响应学生 class 定义的参数:

class Student {
    public static enum SortCriterion {
        ID,
        NAME
    }
    // ...
}

Collection<Student> getAll(SortCriterion sortBy, boolean descending) {
    switch (sortBy) {
    }
}

这将 DAO 耦合到学生(没有坏处,它已经耦合),但 DAO 用户不需要知道排序是如何实际实现的。

但对于任何正常目的,我宁愿不要让 DAO 实现排序;如果你无论如何都 getAll() 学生,为什么不使用一个简单的普通比较器,也许很好地嵌入到学生中:

class Student {
    public static interface Order {
        public final static Comparator<Student> ID = new Comparator() {
            // implemetation
        }
    }
}

如果它 returns 是一个由数据库结果集支持的惰性集合,那么使用 DAO 排序的唯一意义在于。但如果结果集那么大,那你为什么要使用 getAll()?

思考点:排序 DAO 的用例是什么?