gpt4 book ai didi

java - 涉及 JOIN 查询的 DAO

转载 作者:行者123 更新时间:2023-11-30 06:18:15 24 4
gpt4 key购买 nike

我是 DAO 世界的新手。我有 3 张 table 。

  • 消费者
  • 比尔
  • 收据

Consumer 表包含以下字段

  • 消费者编号
  • 消费者姓名
  • 地址

账单表包含

  • 账单号码
  • 账单日期
  • 消费者编号
  • 账单金额

收据表包含

  • receipt_no
  • 发薪日
  • 支付金额
  • 消费者编号

Bill 表与 Consumer 表、Receipt 具有多对一 关系> 表还与 Consumer 表具有多对一关系。

目前我已经创建了三个类

  1. 消费者
  2. 比尔
  3. 收据

并为它们创建了 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

还有一些,但我无法理解。

最佳答案

如果您的 Consumer POJO 变为以下内容,而不是每次您需要访问每个消费者的最新账单/收据时都尝试进行这样的查询:

public class Consumer {
private Integer consumerId;
private String consumerName;
private String address;
// join data into these variables
private Set<Bill> bills = new Set<Bill>(0);
private Set<Receipt> recipts = new Set<Receipt>(0);

// add constructor and getter/setter methods here
}

然后,在您的 ConsumerDAO 中,您的 find 方法可以具有以下逻辑:

public class ConsumerDAO {
/*
* Find a consumer without any transaction data JOINed in
*/
public Consumer find(Integer consumerId){
// create a new Consumer object
// run SQL query to populate consumerId, consumerName, and address fields of new Consumer object
// return new Consumer object
}

/*
* Find a consumer with all transaction data JOINed in
*/
public Consumer findWithTransactionData(Integer consumerId){
// create new consumer object
// run a query to get the the basic fields of the Consumer POJO, that also uses
// JOINs to get all of the consumer's Bills and Receipts; store all of the latter
// in the Consumer object's Sets
// return consumer object
}

/*** Note that the following two methods could even go in the Consumer class at this point ***/
public Bill getMostRecentBill(Consumer consumer){
// iterate through the consumer's bills, and return the most recent one
}

public Receipt getMostRecentReceipt(Consumer consumer){
// iterate through the consumer's receipts, and return the most recent one
}
}

这是你想要做的吗?我认为将“查找最近的”方法放在 Consumer 类本身中是最有意义的,因为这样您就不必将任何东西作为参数传递给该方法;如果需要,您可以对从 findWithTransactionData(Integer) 获得的 Consumer 对象调用 getMostRecentBill()。不过,这通常被认为是一种糟糕的做法,因为 POJO 应该尽可能“愚蠢”。因此,您希望如何处理这取决于您。

关于java - 涉及 JOIN 查询的 DAO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24923842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com