如何实现对 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 的用例是什么?
这个问题是 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 的用例是什么?