这不是特定于任何语言的,它只是关于最佳实践。我正在使用 JPA/Hibernate(但它可以是任何其他 ORM 解决方案),我想知道你们如何处理这种情况:假设您有一个查询返回的东西没有由您的任何域类。您是否创建了一个特定的类来表示该特定查询?您是否在其他类型的对象(数组、地图...)中返回查询 其他解决方案?我想了解您的经验和最佳实践。
PS 实际上,我正在为特定查询创建特定的对象。
这不是特定于任何语言的,它只是关于最佳实践。我正在使用 JPA/Hibernate(但它可以是任何其他 ORM 解决方案),我想知道你们如何处理这种情况:假设您有一个查询返回的东西没有由您的任何域类。您是否创建了一个特定的类来表示该特定查询?您是否在其他类型的对象(数组、地图...)中返回查询 其他解决方案?我想了解您的经验和最佳实践。
PS 实际上,我正在为特定查询创建特定的对象。
我们的情况听起来与您的情况相似。
我们使用单独的对象来报告跨越多个域对象的数据。我们的约定是这些将由数据库中的视图支持,因此我们将它们称为视图对象。我们通常使用它们将复杂数据汇总为平面格式。
将功能包装在某种管理器中的想法总是很好。它允许更好的测试,并因此管理模式更改。
还允许在应用程序中更轻松地重用。千万不要直接把sql放进去!!!。对于 Hibernate,我发现 HQL 非常适合这一点。特别是,如果您可以使用命名查询。还要小心添加过滤器值等使用“字符串附加”,使用参数(我们可以说 SQL 注入吗?)。即使 SQL 在 join 或 where 条件方面是动态的,在某种管理器中具有函数总是最好的。
@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 类中创建特定方法(如 getAllTasks、getOpenTasks),因为这些方法中的每一个都会触发一个新查询。所以问题是:我创建一个新类(类似于 ProjectTasksQuery)只是为了保存这些信息?我在数组或地图中返回信息?还有什么?
我通常编写一个使用 SQL 执行查询的函数,然后将结果放入列表或字典中(在 Java 中,我会使用 ArrayList 或 HashMap)。
如果我发现自己经常这样做,我可能会创建一个新文件来保存所有这些查询。否则,我只会让它们在需要/使用的任何文件中发挥作用。
由于我们专门讨论 Java,我当然不会在单独的文件中创建新类。但是,对于仅在一个类中需要的查询,您可以创建一个私有静态内部类,其中仅包含生成该类所需的查询所需的函数。
阅读有关数据传输对象的内容后,您可能会感觉好些。有些人根本不喜欢它们,但如果你觉得它很适合你,那可能就是。