这个问题是3年前由另一个人在这里提出的,但它没有得到最终答案:Specify Ordering to a DAO Method
我的问题也是如此。我有一个班级学生和一个实施DAO的班级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}
}
答案 0 :(得分:3)
从抽象的角度来看,你需要传递如何排序的信息。这可以通过多种方式设计,但为了简单起见,可以排序的属性直接与学生班级相关联;那么为什么不为可排序属性定义常量呢?
DAO需要对学生班级有深入的了解(因为它必须知道如何创建它们),所以它可以响应学生班级定义的参数:
class Student {
public static enum SortCriterion {
ID,
NAME
}
// ...
}
Collection<Student> getAll(SortCriterion sortBy, boolean descending) {
switch (sortBy) {
}
}
这将DAO与学生结合在一起(没有任何伤害,它已经耦合),但是DAO用户不需要知道实际上是如何实现排序的。
但是出于任何正常目的,我宁愿不让DAO实现排序;无论如何,如果你得到所有()学生,为什么不使用一个简单的普通比较器,也许很好地嵌入学生:
class Student {
public static interface Order {
public final static Comparator<Student> ID = new Comparator() {
// implemetation
}
}
}
进行DAO排序的唯一要点是它是否返回由数据库结果集支持的惰性集合。但是如果结果集很大,那你为什么要使用getAll()?
思考点:排序DAO的用例是什么?