违反 DAO 模式。该怎么办?

Violation of DAO pattern. What to do?

我需要生成然后执行一个复杂的 sql 查询,该查询将访问多个数据库以创建一些通用的 report。这意味着查询与特定的 DAO 对象无关。

那么DTO这样的查询返回结果的逻辑应该放在哪里呢?如果我创建 ReportDao 接口然后实现它可能会给其他开发人员带来麻烦,因为我认为他们会期望 Dao 对象与数据库中的某些 table 绑定。

!意见警告!

DAO 不一定必须链接到特定域 class。没有域 class 是孤立存在的,如果假设一个 DAO 只包含对一个 table/domain class 的操作,那么就会大吃一惊,因为操作可能涉及多个域 classes,因此无论放在哪里都会被错误地放置。最好也将 DAO 视为与特定功能领域相关的方法集合。如果大多数 Dao 都是围绕领域对象建模的,那么以不同的方式命名不同的对象可能是明智的,但是只要我们谈论的是属于 reports/reporting 的方法集合,ReportDao 应该没问题。或者 "GeneralReportDataDao" 更好(请记住,我只有你问题中的信息可以使用,想想 class 代表什么并尝试找到一个描述性名称..)

我在域 classes 之后组织 DAO 时从经验中看到的另一点是,属于中央域 classes 的 DAO 往往会变得非常大,因为中央域 [=27] =]es 通常链接到大量功能。这不仅适用于 DAO-classes,而且适用于使用相同模式组织功能的服务等。

我们在Java中主要有两个"types"个class,我们有class个表示的东西( classes 包含数据,通常是有状态的 classes),classes 某些事情(服务、dao 等,通常是无状态的 classes)。有状态数据 classes 应该根据它们所代表的内容(即数据)来命名和建模,而无状态服务 classes 应该根据功能来命名和建模。虽然尝试以与数据相同的方式组织服务很诱人,但这通常会导致代码质量差,classes 和功能区域分布在多个 classes。