Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 涉及连接查询的DAO_Java_Join_Dao - Fatal编程技术网

Java 涉及连接查询的DAO

Java 涉及连接查询的DAO,java,join,dao,Java,Join,Dao,我对刀的世界是陌生的。我有三张桌子 消费者 账单 收据 消费者表包含以下字段 消费者识别码 消费者名称 住址 账单表包含 票据号码 账单日期 消费者识别码 账单金额 收据表包含 收据号 付款日期 已付金额 消费者识别码 账单表与消费者表之间存在多对一关系,收款表与消费者表之间也存在多对一关系 目前我已经创建了三个类 消费者 账单 收据 并为他们创建了DAO,如ConsumerDAO、BillDAO、ReceiptDAO。它们包含基本的积垢操作 现在我想要一个消费者列表,其中包含这三个表中的数据。

我对刀的世界是陌生的。我有三张桌子

消费者 账单 收据 消费者表包含以下字段

消费者识别码 消费者名称 住址 账单表包含

票据号码 账单日期 消费者识别码 账单金额 收据表包含

收据号 付款日期 已付金额 消费者识别码 账单表与消费者表之间存在多对一关系,收款表与消费者表之间也存在多对一关系

目前我已经创建了三个类

消费者 账单 收据 并为他们创建了DAO,如ConsumerDAO、BillDAO、ReceiptDAO。它们包含基本的积垢操作

现在我想要一个消费者列表,其中包含这三个表中的数据。我正在使用一个连接SQL查询。详情如下:

选择c.consumer\u id, c、 消费者名称, c、 地址:, r、 收据编号:, r、 付款日期, r、 已付金额, b、 条例草案日期, b、 账单号码, b、 账单金额 来自消费者c 左外连接 选择r.consumer\u id, r、 付款日期, r、 收据编号, r、 已付金额, 按r.consumer\u id划分的行数 按r.pay_date作为等级订购 从c.consumer\u id=r.consumer\u id上的收据r r.rank=1 左外连接 选择b.consumer\u id, b、 账单号码, b、 条例草案日期, b、 账单金额, 按b.consumer\u id划分的行数 b.bill_日期为排名的订单 从账单b到c.consumer\u id=b.consumer\u id b.rank=1; 我想知道我应该把这个查询放在哪个DAO中?我想在Consumer类中添加Bill字段和Receipt字段,并在ConsumerDAO中添加getCurrentBillAndReceipt方法。这样做对吗

我看到以下问题:


还有更多,但我无法理解。

如果您每次需要访问每个消费者的最新账单/收据时都尝试进行类似的查询,那么如果您的消费者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
}

这就是你想做的吗?我认为将find-most-recent方法放在Consumer类本身是最有意义的,因为这样就不必将任何东西作为参数传递给该方法;如果愿意,您可以对从findWithTransactionDataInteger获得的Consumer对象调用getMostRecentBill。不过,这通常被认为是一种糟糕的做法,因为POJO应该尽可能地愚蠢。因此,您想如何处理这件事取决于您。

请记住,虽然这对理解这一概念很有帮助,但有一些ORM工具,如Avaje Eben,可以让您的生活更轻松。另外:您能否解释账单和收据之间的区别?我想我知道你想要什么,但我想说清楚。@nmagerko,账单是给消费者的东西,这样他就可以知道他应该付多少钱,收据是存储消费者付款信息的东西。好吧,酷。由于您的账单和收据与Consumers表中的消费者之间存在多对一关系,因此我建议您将所有消费者的收据合并到consumer类中的一个集合中,并将他/她的所有账单合并到同一个类中的一个集合中。这将在DAO检索消费者时完成。然后,您可以在消费者DAO中编写一个方法来检查用户的账单和收据,不再需要疯狂的SQL查询并返回您需要的内容need@nmagerko,正如您从我的sql中看到的,我必须获取有关消费者最新账单和收据的信息,并且通过使用该sql,我可以在一次操作中获取该信息。根据你的回答,我必须对我需要的结果进行多个SQL查询。不是吗?我明白你说的,但我对DB进行了不止一次SQL查询,并且收集了比我必须收集的更多的数据。这不会降低性能吗?请参阅我的编辑。在调用findWithTransactionData时,您确实需要一个SQL查询。然后,您将拥有所有消费者的账单和收据,而无需每次需要获取最新账单/收据时都访问数据库。后一部分是性能得到提升的地方。您甚至可能希望添加findWithBills和findWithReceipts,其中您分别只加入bills和receipts数据,从而限制您提取的数据。在代码的其他地方,您调用了最适合您的需要的find方法。我想我最后会说:您发布的查询或它的某种形式属于ConsumerDAO。在创建使用者对象时是否要加入所有数据,或者在DAO中有一个方法可以根据需要为您获取数据,这实际上取决于每个用户使用该数据的频率。我的解决方案在需要操纵账单/收据的情况下效果最好
使用者often@kaushik希望这有助于:
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
    }
}