如何实现DAO方法的排序?

时间:2015-06-26 18:11:39

标签: java dao

这个问题是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}
} 

1 个答案:

答案 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的用例是什么?