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

问题描述:

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

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

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

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

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

将功能封装在某种管理器中的想法总是很好。它允许更好的测试,并因此管理模式更改。

还允许在应用程序中更容易重用。切勿将SQL直接放入!!!对于Hibernate,我发现HQL非常适合这一点。特别是,如果您可以使用命名查询。还要小心添加一个过滤器值等使用“字符串附加”,使用参数(我们可以说SQL注入?)。即使SQL在连接或标准方面是动态的,在某种管理器中有一个函数总是最好的。

我们的情况听起来与您的相似。

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

+0

这就是我现在正在做的事情。我觉得这是一个更实际的解决方案,我发现还有其他人也这样做。好吧,太好了! – 2008-09-09 12:46:17

@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 

我不有可能代表该信息的任何领域类和我不想要创建项目类的特定方法(如getAllTask​​s,getOpenTasks),因为每个这些方法会触发一个新的查询。 所以问题是: 我创建一个新类(像ProjectTasksQuery somenthing)只是为了保存这些信息? 我返回数组或地图内的信息? 还有别的吗?

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