如果 sql 连接 2 个表,如何操作数据传输对象?

Posted

技术标签:

【中文标题】如果 sql 连接 2 个表,如何操作数据传输对象?【英文标题】:How to manipulate Data Transfer Object if sql join 2 tables? 【发布时间】:2011-04-16 23:42:51 【问题描述】:

我在 Data Access Object DAOComments 中有一个查询,它连接 users 表和 cmets 表,然后将结果存储到 Data Transfer Object DTOComments:

private static final String SQL_FIND_WITH_USERNAME =
"SELECT u.username, comments.* FROM users u JOIN comments 
ON u.id = comments.id ORDER BY created_date DESC LIMIT 10;";

但是,DTOComments 没有属性“用户名”,因为它是 DTOUsers 的属性。

选项 1

所以我决定使用Map<String, DTOComments>

在这种情况下,地图有username as KEY, DTOComments as VALUE.

但是这种方法会失败,因为我关心结果的顺序,这就是为什么我的查询以降序返回结果的原因。如果我在 JSP 页面上迭代地图,顺序不一致,所以我的 JSP 页面会以随机顺序输出评论。

(即使顺序无关紧要,我不知道JSTL是否可以显示地图的KEY。我知道显示VALUE)

选项 2

我可以把查询结果放到ArrayList<DTOComments>

但我现在看不到任何空间来存储"username"。也许我可以向 DTOComments 添加新属性,例如 private String username;

hmm...这将违反拥有 DTO 的概念,因为它应该反映数据库表架构。

选项 3

创建包含我需要的所有信息的新类(即用户名 + DTOComments 的属性)。

但是仅仅因为除了 DTOComments 的属性之外我还需要一个属性“用户名”,创建新类似乎不是正确的方法。

谁能给我建议如何以更有条理的方式存储上述查询返回的所有信息?

【问题讨论】:

不清楚您到底想要什么顺序。 ORDER BY 为空。你能详细说明一下吗?你想ORDER BY u.username, c.id 还是ORDER BY c.id?如果是前者,你想如何在 JSP 中显示?通过评论 ID 还是通过用户名然后评论 ID? 糟糕,按 created_date 排序,所以我希望评论以最近发布的顺序显示。我马上更新。 【参考方案1】:

如果我在JSP页面上迭代地图,顺序不一致,所以我的JSP页面会以随机顺序输出评论。

这就是HashMap 的本质。如果您想在Map 中维护插入顺序,那么您应该改用LinkedHashMap。但是Map<User, Comment> 方法还有另一个缺点,如果用户发布了多个评论,您将以这种方式覆盖之前插入的评论。您想改用Map<Comment, User>

但恕我直言,最好将User 设为Comment 类中的属性,表示多对一关系:

public class Comment 
    private User user; // +getter +setter

这样你就可以得到List<Comment>


也就是说,我想对你的另一句话发表评论:

我不知道JSTL是否可以显示地图的KEY。我知道显示 VALUE)

您可以使用<c:forEach> 遍历地图。它超过了Map#entrySet()。每次迭代都会返回一个Map.Entry 对象,该对象又具有getKey()getValue() 方法。

这是一个启动示例:

<c:forEach items="$map" var="entry">
    Key: $entry.key, value: $entry.value<br>
</c:forEach>

【讨论】:

我喜欢后一种方法,所以您是说 Class Comment 是 DTO 并添加包含 DTOUser 的属性,还是您提供的示例是全新的类? 不,不要创建新类。重用现有的评论和用户类。它们在数据库中有明确定义的关系(外键,对吗?),这也应该反映在模型中。此外,您还可以在 User 模型中添加 List&lt;Comment&gt; 属性。你可以让它在第一次 getter 访问时延迟加载。就像 Hibernate/JPA 也在做的那样(你是不是在重新发明方面走得太远了?还是只是为了爱好/学习目的?如果是这样,那就继续吧:))。 哦,我明白了,很高兴知道我可以向模态添加关系属性!我这样做是为了学习/爱好,但首先我想学习正确的编码/设计方法:) 非常感谢您每次的帮助,我非常感谢您的深入回答!

以上是关于如果 sql 连接 2 个表,如何操作数据传输对象?的主要内容,如果未能解决你的问题,请参考以下文章

SQL怎么连接查询2个表?

sql数据库中,如何快速找数据量最大的几个表

SQL - 内连接 2 个表,但如果 1 个表为空,则返回所有表

在数据库中创建视图最多可以连接多少个表?连接表多了有啥影响…

具有 OR 条件的 2 个表之间的 SQL 连接

涉及超过 2 个表连接的概念 SQL JOIN 问题