【发布时间】:2011-03-20 20:31:19
【问题描述】:
应该如何根据用户定义的标准过滤一系列域对象?过滤方法应该在模型中还是应该在 DAO 中?
【问题讨论】:
标签: java model-view-controller model dao
应该如何根据用户定义的标准过滤一系列域对象?过滤方法应该在模型中还是应该在 DAO 中?
【问题讨论】:
标签: java model-view-controller model dao
是先检索更多的对象然后进行过滤还是简单地首先检索正确的对象取决于基础数据。大多数应用程序会结合使用两者。
我会考虑的事情是:
网络带宽和内存要求
如果过滤后有少量结果,但过滤前结果数量明显较多,那么在代码中进行过滤可能会浪费带宽和内存资源。
查询速度
在数据库中过滤结果可能比在代码中执行逻辑更昂贵 - 磁盘与内存。需要索引才能使其有价值。
可维护性
创建新查询可能很耗时。这肯定意味着编写一些 sql 并重新访问测试的各个阶段。它可能需要修改 db 架构,例如添加索引以加快查询速度。
在用 Java 解决这个问题时,可能值得考虑访问者模式。我经常使用 SingleMatcher 和 MultipleMatcher 两个接口来过滤对象的集合。可以组合这些实现以创建新的用户定义标准。这样做的另一个好处是,一旦您有了用户可能想要使用的匹配器,您就不必返回测试来创建新标准。
【讨论】:
如果您只想(主要)将模型对象用作数据容器,则应将过滤器放入您已在使用的 DAO 中。确保用户定义的条件独立于数据库是一个很好的做法(因此请传递您自己的过滤器对象而不是简单的,例如 Hibernate Criteria。通过示例查询也可以很好地工作)。
那么你的 DAO 方法可以如下所示:
public interface BeanDao
{
List<Bean> findAllByFilter(BeanFilter filter);
}
【讨论】: