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

时间:2008-09-09 11:34:07

标签: orm

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

P.S。 实际上我正在为特定查询创建特定的对象。

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

如果我发现自己这么做了,我可能会创建一个新文件来保存所有这些查询。否则,我只是在需要/使用的任何文件中使它们成为函数。

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

答案 2 :(得分:0)

在某种经理中包装该功能的想法总是很好。它允许更好地测试和管理模式更改。

还允许在应用程序中更容易重用。永远不要直接把sql放进!!!对于Hibernate,我发现HQL非常适用于此。特别是,如果您可以使用命名查询。还要注意添加过滤器值等使用“string append”,使用参数(我们可以说是SQL注入吗?)。即使SQL在连接方面或标准方面是动态的,在某种类型的管理器中使用函数总是最好的。

答案 3 :(得分:0)

@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这样的somenthing)只是为了保存这些信息? 我在数组或地图中返回信息? 还有别的吗?

答案 4 :(得分:0)

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