在Spring JPA中聚合来自多个表的数据的正确方法

问题描述 投票:0回答:1

我有一个问答部分,每个问题和答案都有与之相关的用户个人资料卡。这非常类似于堆栈溢出的情况。组成此用户个人资料卡的数据分布在多个表中。我正在从每个表中获取一两列。现在,我不确定应该采用哪种方法将用户个人资料卡与每个问题和答案相关联。以下是我的想法

  1. 由于用户个人资料卡本身不是一个单一的实体,而是一个聚合对象,因此我无法在问答实体中建立直接的关联
  2. 我已经考虑过创建DTO作为投影,以将问题和用户个人资料卡的数据汇总到一个DTO中,如下所示>>

    @Query("select new com.QuestionDto(q.id, q.topic, q.views, ud.username, ur.points) from QuestionEntity q join UserDetails ud ON q.userId = ud.userId join userRanking ur ON ud.userId = ur.userId where q.id = :id")
    QuestionDto findQuestionDto(@Param("id") Long id);
    
  3. 我看到的这种方法的问题是,也会有这样的DTO来回答,评论等。因此,每当用户个人资料卡发生更改时,我都需要对所有DTO进行相应更改。从代码可维护性的角度来看,这将是一个非常糟糕的设计。

  1. 另一种方法是将用户个人资料卡数据聚合到自身的DTO中,然后从每个问题,答案等中调用此DTO。使用这种方法,至少将用户个人资料卡的逻辑放在一个位置。

    @Query("select new com.UserProfileCard( ud.username, ur.points) from UserDetails ud join userRanking ur ON ud.userId = ur.userId where ud.userId = :id")
    UserProfileCard getUserProfileCard(@Param("id") Long userId);
    
  2. 但是另一方面,如果一个问题有15个答复,则每个用户将得到(1 + 15)个查询。从性能的角度来看,我认为这不是非常有效。

还有什么?从代码的可维护性以及性能的角度来看,我还缺少其他任何一种好的方法吗?]

谢谢

我有一个问答部分,每个问题和答案都有与之相关的用户个人资料卡。这非常类似于堆栈溢出的情况。组成此用户个人资料卡的数据为...

java spring jpa entity projection
1个回答
0
投票
  1. 我已经考虑过创建DTO作为预测,以将问题和用户个人资料卡的数据汇总到一个DTO中,如下所示>>
© www.soinside.com 2019 - 2024. All rights reserved.