如果 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<Comment>
属性。你可以让它在第一次 getter 访问时延迟加载。就像 Hibernate/JPA 也在做的那样(你是不是在重新发明方面走得太远了?还是只是为了爱好/学习目的?如果是这样,那就继续吧:))。
哦,我明白了,很高兴知道我可以向模态添加关系属性!我这样做是为了学习/爱好,但首先我想学习正确的编码/设计方法:) 非常感谢您每次的帮助,我非常感谢您的深入回答!以上是关于如果 sql 连接 2 个表,如何操作数据传输对象?的主要内容,如果未能解决你的问题,请参考以下文章
SQL - 内连接 2 个表,但如果 1 个表为空,则返回所有表