如何处理在域模型中没有表示的查询?

Posted

技术标签:

【中文标题】如何处理在域模型中没有表示的查询?【英文标题】:What to do with queries which don´t have a representation in a domain model? 【发布时间】:2008-09-09 11:34:07 【问题描述】:

这并不特定于任何语言,它只是关于最佳实践。我正在使用 JPA/Hibernate(但它可以是任何其他 ORM 解决方案),我想知道你们如何处理这种情况: 假设您有一个查询返回的内容未由您的任何域类表示。 您是否创建了一个特定的类来表示该特定查询? 您是否以其他类型的对象(数组、地图...)返回查询 其他一些解决方案? 我想了解您的经验和最佳做法。

附: 实际上我正在为特定查询创建特定的对象。

【问题讨论】:

【参考方案1】:

我们的情况与您的情况相似。

我们使用单独的对象来报告跨越多个域对象的数据。我们的约定是这些将由数据库中的视图支持,因此我们将它们称为视图对象。我们通常使用它们将复杂数据汇总为平面格式。

【讨论】:

这就是我现在正在做的事情。我发现这是一个更实用的解决方案,并且我看到其他人也在这样做。嗯,太好了!【参考方案2】:

我通常编写一个使用 SQL 执行查询的函数,然后将结果放入列表或字典中(在 Java 中,我会使用 ArrayList 或 HashMap)。

如果我发现自己经常这样做,我可能会创建一个新文件来保存所有这些查询。否则,我只会让它们在需要/使用的任何文件中发挥作用。

由于我们专门讨论 Java,我当然不会在单独的文件中创建新类。但是,对于仅在一个类中需要的查询,您可以创建一个私有静态内部类,其中仅包含生成该类所需的查询所需的函数。

【讨论】:

【参考方案3】:

将功能包装在某种管理器中的想法总是很好。它允许更好地测试和管理架构更改。

还允许在应用程序中更轻松地重用。千万不要直接把sql放进去!!!。对于 Hibernate,我发现 HQL 非常适合这一点。特别是,如果您可以使用命名查询。还要小心添加过滤器值等使用“字符串附加”,使用参数(我们可以说 SQL 注入吗?)。即使 SQL 在 join 或 where 条件方面是动态的,在某种管理器中具有函数总是最好的。

【讨论】:

【参考方案4】:

@DrPizza

我会更具体。我们在一个数据库中有三个表

USER
PROJECT
TASK
USER to TASK 1:n
PROJECT to TASK 1:n

我有一个查询,它返回所有项目的列表,但也显示一些分组信息(所有任务、打开的任务、关闭的任务)。返回时,查询如下所示

PROJECTID: 1
NAME: New Web Site
ALLTASK: 10
OPENTASK: 7
CLOSEDTASK: 3

我没有任何可以表示此信息的域类,并且我不想在 Project 类中创建特定方法(如 getAllTask​​s、getOpenTasks),因为这些方法中的每一个都会触发一个新查询。 所以问题是: 我创建一个新类(类似于 ProjectTasksQuery)只是为了保存这些信息? 我在数组或地图中返回信息? 还有什么?

【讨论】:

【参考方案5】:

阅读Data Transfer Objects 后,您可能会感觉好些。有些人plain don't like them,但如果你觉得它很适合你,那可能是。

【讨论】:

以上是关于如何处理在域模型中没有表示的查询?的主要内容,如果未能解决你的问题,请参考以下文章

在 Grafana 中,我们如何处理在图表/面板中返回 0 行的查询?

如何处理在源代码中找不到 OpenCV

如何处理在 Angular CLI 中安装对等依赖项?

GraphQL:如何处理在自己的类型定义中引用类型?

如何处理在反编译时,原包验证包名问题

Node.js:如何处理在字典中查找同名的不同城市?