简体   繁体   English

从 MySQL 获取查询到 Java

[英]Fetching query from MySQL onto Java

I created a query on MySQL workbench, it worked fine, but when I tried to show that query on Java it does not work.我在 MySQL 工作台上创建了一个查询,它运行良好,但是当我试图在 Java 上显示该查询时它不起作用。 I'm new to this, and using classicmodels Db.我是新手,并且使用的是经典模型 Db。 The following query that worked on workbench:在工作台上工作的以下查询:

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'

Here is my Java code:这是我的 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

The problem here is the group by clause.这里的问题是group by子句。 You've grouped on one field, and failed to ensure all the other fields are either uniquely determined by that field, or grouped functions.您已对一个字段进行分组,但未能确保所有其他字段要么由该字段唯一确定,要么由分组函数确定。 Remove the group by productCode and everything should work. group by productCode ,一切正常。

I think the reason it "worked" in MySQL workbench is probably that there is an option you can set (but probably should not) that allows improper grouped fields to "work" (I think by just picking one of many values).我认为它在 MySQL 工作台中“工作”的原因可能是您可以设置(但可能不应该)允许不正确的分组字段“工作”的选项(我认为只需选择多个值之一)。

As an example of a query that might work, the following should report the commission each employee has earned by product sold.作为一个可能有效的查询示例,以下应报告每位员工已按所售产品赚取的佣金。 Since the customer is irrelevant to that information, that table wasn't queried.由于客户与该信息无关,因此未查询该表。

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM