【发布时间】:2014-07-24 01:46:58
【问题描述】:
我是 DAO 世界的新手。我有 3 张桌子。
- 消费者
- 比尔
- 收据
消费者表包含以下字段
- consumer_id
- 消费者姓名
- 地址
账单表包含
- bill_number
- 账单日期
- consumer_id
- bill_amount
收据表包含
- receipt_no
- 支付日期
- 已付金额
- consumer_id
Bill 表与 Consumer 表、Receipt 具有多对一 关系> 表还与 Consumer 表具有 多对一 关系。
目前我已经创建了三个类
- 消费者
- 比尔
- 收据
并为他们创建了 DAO,例如 ConsumerDAO、BillDAO、ReceiptDAO。它们包含基本的 CRUD 操作。
现在我想要一个涉及这三个表中数据的消费者列表。我正在使用 JOIN SQL 查询。如下:
SELECT c.consumer_id,
c.consumer_name,
c.address,
r.receipt_no,
r.pay_date,
r.paid_amount,
b.bill_date,
b.bill_number,
b.bill_amount
FROM consumer c
LEFT OUTER JOIN
(SELECT r.consumer_id,
r.pay_date,
r.receipt_number,
r.paid_amount,
ROW_NUMBER() OVER (PARTITION BY r.consumer_id
ORDER BY r.pay_date) AS rank
FROM receipt r) r ON (c.consumer_id = r.consumer_id
AND r.rank = 1)
LEFT OUTER JOIN
(SELECT b.consumer_id,
b.bill_number,
b.bill_date,
b.bill_amount,
ROW_NUMBER() OVER (PARTITION BY b.consumer_id
ORDER BY b.bill_date) AS rank
FROM bill b) b ON (c.consumer_id = b.consumer_id
AND b.rank = 1)";
我想知道我应该将这个查询放在哪个 DAO 中?我想在 Consumer 类中添加一个 Bill 字段 和一个 Receipt 字段并在 ConsumerDAO 中添加 getCurrentBillAndReceipt() 方法。这是正确的做法吗?
我阅读了以下问题:
how to create a DAO for join tables
还有更多,但我无法理解。
【问题讨论】:
-
请记住,虽然这有助于理解这个概念,但有一些像 Avaje Ebean 这样的 ORM 工具会让你的生活变得更轻松。
-
另外:你能解释一下账单和收据之间的区别吗?我想我知道你要做什么,但我想明确一点。
-
@nmagerko,账单是给消费者的东西,以便他知道他应该支付多少,而收据是存储有关消费者付款信息的东西。
-
好吧,很酷。由于您的账单和收据与消费者表中的消费者有多对一的关系,我建议您将所有消费者的收据加入消费者类中的
Set,并将他/她的所有计入同一类中的Set(这将在您的 DAO 检索消费者时完成)。然后,您可以在 Consumer DAO 中编写一个方法来处理用户的账单和收据(无需冗长、疯狂的 SQL 查询)并返回您需要的内容 -
@nmagerko,正如您从我的 sql 中看到的那样,我必须获取有关消费者最新账单和收据的信息,并且通过使用该 SQL,我可以在单个操作中获取该信息。根据您的回答,我必须为我需要的结果进行多个 SQL 查询。不是吗?