gpt4 book ai didi

java - 我应该为每种数据库查询创建新实体吗?

转载 作者:行者123 更新时间:2023-12-02 01:51:44 26 4
gpt4 key购买 nike

是否有任何最佳实践可以避免大量 DTO 和实体?

现在我的应用程序为每个数据库表都有一些实体和 DTO。然而,因为来自用户界面的查询我为每个查询创建了新的实体和 DTO,这导致了 DTO 实体 hell 。

举个例子:

尽管我们的应用程序非常简单并且只有两个数据库表:

  • 包含 id、姓名、年龄、vehicle_id 的人员表;
  • 包含 ID、品牌名称、速度、价格的车辆表;

起点是我们只有以下类:

  • PersonEntity、PersonDto、VehicleEntity、VehicleDto

用户可以通过id和名称获取人员、车辆。到目前为止很简单。

但是我们有一个新要求:

用户想按人名查询车辆平均价格。(即所有弗兰克人拥有的车辆的平均价格为 25.213 美元)所以在 ui 方面我们需要一个对象:PersonGrouppedAvgPrice 包含 personName 和averagePrice 字段

我找到了以下解决方案:

  1. 因此,我们要么从数据库中获取具有给定名称的所有人员以及相应的汽车并将其返回给 UI(并且计算将在 ui 端进行),这会导致不必要的网络流量和内存消耗,但至少我们不会被迫创建新实体。

  2. 我们仍然从数据库中获取上述所有内容,并在服务器端的 DTO 级别进行计算。在这种情况下我们仍然没有被迫创建新实体,但我们必须创建新的 DTO。网络流量降低但内存仍然存在高。

  3. 我们在 DAO 级别上进行相应的逻辑,查询如下:
    从 person_table 中选择 p.name,avg(v.price) 作为 p 内连接...等在这种情况下,我们只返回最有效的必要信息,但在这种情况下,我们需要新的 DTO 和实体。

我用的是第三个。但由于各种 UI 查询,新类的数量升级到了将来难以维护的水平。对于 20 个数据库表,我必须创建 ~4-4 个实体和 DTO,即 ~160 个类。

有没有更好的方法来做到这一点?

最佳答案

第 3 点是 RDMBS 的正确方法。您应该使用查询在数据库中执行此工作,因为将所有表数据从数据库服务器传输到应用程序服务器效率很低。

对于每个需要专门投影的自定义查询,您最终可能会得到额外的 DTO 类。这不一定是错误的,它有助于编写单元测试。有几种方法可以减少 DTO 类的数量,例如通过使用元组as described in this article .

关于java - 我应该为每种数据库查询创建新实体吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52903964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com