如何将具有重复属性的元组组合成一个元组?

问题描述 投票:0回答:1

我从SQL数据库中创建了一个与表同名的java类,利用从表中获取的信息,我从该Java类中创建了多个对象,并将它们存储在An ArrayList中。

CREATE TABLE `orderdetails` (
  `orderNumber` int(11) NOT NULL,
  `productCode` varchar(15) NOT NULL,
  `quantityOrdered` int(11) NOT NULL,
  `priceEach` decimal(10,2) NOT NULL,
  `orderLineNumber` smallint(6) NOT NULL,
  PRIMARY KEY (`orderNumber`,`productCode`),
  KEY `productCode` (`productCode`),
  CONSTRAINT `orderdetails_ibfk_1` FOREIGN KEY (`orderNumber`) REFERENCES `orders` (`orderNumber`),
  CONSTRAINT `orderdetails_ibfk_2` FOREIGN KEY (`productCode`) REFERENCES `products` (`productCode`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

例如,元组有重复的orderNumbers。

(10100,'S18_1749',30,'136.00',3),

(10100,'S18_2248',50,'55.09',2),

(10100,'S18_4409',22,'75.46',4),

每个元组都会被转化成一个与表同名的java类对象 并存储在一个ArrayList中。

public ArrayList<OrderDetails> getOrders(String tableName) throws SQLException{
        ArrayList<OrderDetails>od=new ArrayList<OrderDetails>();

        try {
            String query="SELECT * FROM "+tableName;
            Statement s= con.createStatement();
            ResultSet rs= s.executeQuery(query);

            while(rs.next()) {

                int orderNumber=rs.getInt("orderNumber");
                String productCode=rs.getString("productCode");
                int quantityOrdered=rs.getInt("quantityOrdered");
                double priceEach=rs.getDouble("priceEach");
                int orderLineNumber=rs.getInt("orderLineNumber");

                OrderDetails temp=new OrderDetails(orderNumber, productCode, quantityOrdered, priceEach, orderLineNumber);
                od.add(temp);

            }

        }
        catch(SQLException e) {

            System.out.println("SQL exception happened while retriving data, close connection");

            throw new RuntimeException(e);  
        }
        return od;
    }

我试图在ArrayList中循环,并输出每个checkNumber的总金额(priceEach乘以quantityOrdered)。但如果我只是简单地一个对象一个对象地在ArrayList中循环,那是行不通的,因为我只是简单地看到每个checkNumber的总金额(priceEach乘以quantityOrdered)。因为我在控制台上看到的只是每个对象的总和,而不是每个checkNumber。

ArrayList<OrderDetails>od= this.getOrders("orderdetails");
for(int i=0;i<=od.size();i++) {
         System.out.println(od.get(i).getPriceEach()*od.get(i).getQuantityOrdered());

     }

我希望在控制台上显示这样的内容(没有重复的checkNumber)。

CheckNumber 10100, total value: 8494.62 (if you add up the product between priceEach and quantityOrdered for the three tuples shown above earlier in my question is the rsult)

简而言之就是有没有办法让我把具有重复属性的对象组合成一个?如果我的问题看起来非常模糊,你不知道问题到底是什么,我很抱歉。如果你能联系我并要求进一步澄清,那将会非常感激,有时描述一个太具体的问题是非常困难的。

java mysql sql arraylist jdbc
1个回答
1
投票

为什么不直接在数据库中进行计算呢?SQL是一种基于集合的语言,与Java中的迭代循环相比,这种类型的操作非常高效。

考虑下面的聚合查询。

select orderNumber, sum(quantityOrdered * priceEach) totalValue
from mytable
group by orderNumber

这样可以得到每个订单的一条记录 所有对应行的总价值。

© www.soinside.com 2019 - 2024. All rights reserved.