【发布时间】:2020-04-23 02:30:06
【问题描述】:
我有一个问答部分,其中每个问题和答案都有与之关联的用户个人资料卡。它与堆栈溢出时的情况非常相似。构成此用户资料卡的数据分布在多个表中。我从这些表中的每一个中获取一两列。现在我不确定应该采取什么方法将用户个人资料卡与每个问题和答案相关联。以下是我的想法
- 我无法在问答实体中建立直接关联,因为用户个人资料卡本身不是单个实体,而是一个聚合对象
-
我考虑过创建 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);
我看到这种方法的问题是会有这样的 DTO 来回答,cmets 等。因此,每当用户资料卡发生更改时,我都需要相应地对所有 DTO 进行更改。从代码可维护性的角度来看,这将是一个非常糟糕的设计。
-
另一种方法是将用户资料卡数据聚合到其自身的 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);
但另一方面,如果一个问题有 15 条回复,则每个用户都会有 (1 + 15) 次查询。从性能的角度来看,我认为这不是很有效。
还有什么?从代码可维护性和性能的角度来看,我还缺少什么其他方法吗?
谢谢
【问题讨论】:
标签: java spring jpa entity projection