【问题标题】:Fetching query from MySQL onto Java从 MySQL 获取查询到 Java
【发布时间】:2022-01-07 12:53:19
【问题描述】:

我在 MySQL 工作台上创建了一个查询,它运行良好,但是当我尝试在 Java 上显示该查询时它不起作用。我是新手,并且使用的是经典模型 Db。以下查询适用于工作台:

select c.customerNumber, c.customerName,
o.orderNumber,
d.productCode, d.quantityOrdered, d.priceEach, (d.quantityOrdered * d.priceEach) as totalPrice,
e.employeeNumber, e.lastName, ((d.quantityOrdered * d.priceEach)*0.01) as commission
from customers as c inner join orders as o on c.customerNumber=o.customerNumber inner join 
orderdetails as d on o.orderNumber=d.orderNumber
inner join employees as e on c.salesRepEmployeeNumber=e.employeeNumber group by productCode;

'486', 'Motor Mint Distributors Inc.', '10109', 'S18_1129', '26', '117.48', '3054.48', '1323', 'Vanauf', '30.5448'

这是我的 Java 代码:

public void query() {

    try {
        Class.forName("com.mysql.jdbc.Driver");

        conn = DriverManager.getConnection(urlConn, user, passWord);
        pdState = conn.prepareStatement("SELECT c.customerNumber, c.customerName,o.orderNumber,"
                + " d.productCode, d.quantityOrdered, d.priceEach,(d.quantityOrdered * d.priceEach) as totalPrice,"
                + " e.employeeNumber, e.lastName,((d.quantityOrdered * d.priceEach)*0.01) as commission"
                + " FROM customers as c inner join orders as o on c.customerNumber=o.customerNumber"
                + " inner join orderdetails as d on o.orderNumber=d.orderNumber"
                + " inner join employees as e on c.salesRepEmployeeNumber=e.employeeNumbergroup by productCode");

        rSet = pdState.executeQuery();

        ResultSetMetaData rsmd = rSet.getMetaData();
        c = rsmd.getColumnCount();

        DefaultTableModel dtModel = (DefaultTableModel) tblQuery.getModel();
        dtModel.setRowCount(0);

        while (rSet.next()) {
            @SuppressWarnings("UseOfObsoleteCollectionType")
            Vector vector = new Vector();
            for (int i = 1; i <= c; i++) {
                vector.add(rSet.getString("customerNumber"));
                vector.add(rSet.getString("customerName"));
                vector.add(rSet.getString("orderNumber"));
                vector.add(rSet.getString("productCode"));
                vector.add(rSet.getString("quantityOrdered"));
                vector.add(rSet.getString("priceEach"));
                vector.add(rSet.getString("totalPrice"));
                vector.add(rSet.getString("employeeNumber"));
                vector.add(rSet.getString("lastName"));
                vector.add(rSet.getString("commission"));
            }//end of for loop

            dtModel.addRow(vector);

        }//end of while loop
    } catch (ClassNotFoundException | SQLException e) {
        e.getMessage();
    }//end of try and catch block
}//end of query

【问题讨论】:

  • e.getMessage(); 没有做任何有用的事情。它从堆栈跟踪中得到一个缩写的 String 然后 .. 绝对 nothing 用它。最好使用e.printStackTrace(); - 这将为System.err 流提供有用的堆栈跟踪。

标签: java mysql swing


【解决方案1】:

这里的问题是group by 子句。您已对一个字段进行分组,但未能确保所有其他字段要么由该字段唯一确定,要么由分组函数确定。删除group by productCode,一切正常。

我认为它在 MySQL 工作台中“工作”的原因可能是您可以设置(但可能不应该)允许不正确的分组字段“工作”的选项(我认为只需选择多个值之一) .

作为一个可能有效的查询示例,以下内容应报告每位员工根据所售产品获得的佣金。由于客户与该信息无关,因此未查询该表。

select d.productCode, e.employeeNumber, e.lastName, 
       sum((d.quantityOrdered * d.priceEach)*0.01) as commission
from orders as o
inner join orderdetails as d on o.orderNumber=d.orderNumber
inner join employees as e on c.salesRepEmployeeNumber=e.employeeNumber
group by productCode, employeeNumber;

【讨论】:

  • Andrew Thompson,非常感谢您的帮助,我刚刚将 e,getMessage() 替换为 e.PrintStackTrace() 并且 group by 之前没有空格,现在它可以正常工作,包括 group by,感谢您的帮助。
  • David G,非常感谢您的帮助,我刚刚将 e,getMessage() 替换为 e.PrintStackTrace() 并且 group by 之前没有空格,现在它可以正常工作,包括 group by,我感谢您的帮助。同时,感谢所有试图提供帮助的人。
  • 好......但我真的认为你会发现它没有产生你想要的价值。我建议在有或没有 group by 的情况下尝试一下,看看是否有意义。
  • David G. 我删除了 group by,差别不大,因为默认情况下按 customerNumber 分组,并以相同的顺序显示,但只是分散的 productCode
  • @Learner 我想你也应该试试order by。不,它不是按 customerNumber 分组的,只是按它排序的。注意获取的行数。 group by 指示该字段(或多个字段)的所有相等值应合并为一行。我认为您想要group by 而不使用组函数不太可能
猜你喜欢
  • 1970-01-01
  • 2021-11-02
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 2015-08-04
相关资源
最近更新 更多