2017-01-10 78 views
-1

我創造了這個查詢從多個表中獲取數據,Mysql數據操作查詢不返回結果?

DROP TABLE IF EXISTS tmp_acc; 
DROP TABLE IF EXISTS tmp_loan; 

CREATE 
TEMPORARY TABLE 
IF NOT EXISTS 
tmp_acc AS 
    (SELECT 
     ac.date, 
     COALESCE((SELECT SUM(cash) FROM accounts WHERE MONTH(date) = MONTH(ac.date - INTERVAL 1 MONTH) AND YEAR(date) = YEAR(ac.date - INTERVAL 1 YEAR)), 0)AS op_cash, 
     COALESCE((SELECT SUM(bank) FROM accounts WHERE MONTH(date) = MONTH(ac.date - INTERVAL 1 MONTH) AND YEAR(date) = YEAR(ac.date - INTERVAL 1 YEAR)),0)AS op_bank, 
     COALESCE((SELECT SUM(ho_funds) FROM accounts WHERE date = ac.date), 0)AS ho_funds, 
     COALESCE((SELECT SUM(recieved) FROM funds WHERE date = ac.date AND branch_to = 'kandy' AND method = 'Cash'),0)AS funds_cash, 
     COALESCE((SELECT SUM(recieved) FROM funds WHERE date = ac.date AND branch_to = 'kandy' AND method = 'Bank'),0)AS funds_bank, 
     COALESCE((SELECT SUM(diposit) FROM bank WHERE date = ac.date),0)AS diposits, 
     COALESCE((SELECT SUM(withdraw) FROM bank WHERE date = ac.date),0)AS withdrawals 
    FROM accounts ac); 

CREATE 
TEMPORARY TABLE 
IF NOT EXISTS 
tmp_loan AS 
    SELECT ls.date, COUNT(l.idloan)AS count, l.interest,l.admission_fee,l.document_fee,l.insuarance, 
     (SELECT SUM(d1.overdue) FROM daily_collections d1 WHERE d1.loan_idloan = l.idloan)AS overdue_collection, 
     ls.completed_date 
    FROM loan l 
    LEFT OUTER JOIN daily_collections d ON l.idloan = d.loan_idloan 
    JOIN loan_session ls ON ls.loan_idloan = l.idloan 
    WHERE ls.completed = 'Yes' 
    GROUP BY ls.completed_date,l.interest; 

    SELECT 
     a.date,COALESCE(a.op_cash,0)AS op_cash,COALESCE(a.op_bank,0)AS op_bank, COALESCE(a.ho_funds,0)AS ho_funds, 
     COALESCE(a.funds_cash,0)AS funds_cash, COALESCE(a.funds_bank,0)AS funds_bank,COALESCE(a.diposits,0)AS diposits, COALESCE(a.withdrawals,0)AS withdrawals, 
     COALESCE(l.count,0)AS count, COALESCE(l.interest,0)AS interest, COALESCE(l.admission_fee,0)AS admision_fee, 
     COALESCE(l.document_fee,0)AS document_fee, COALESCE(l.insuarance,0)AS insrance, COALESCE(l.overdue_collection,0)AS overdue_collection 
    FROM tmp_acc a 
    LEFT OUTER JOIN tmp_loan l ON a.date = l.completed_date 
    WHERE MONTH(a.date) = MONTH(current_date()) 

我用這個查詢產生碧玉報告,並在java中查看數據。此查詢在工作臺中正常工作,並返回所有結果。

但它不工作在Java。我用Statement.executeQuery()並分配給ResultSet。我打印ResultSet,但沒有打印。

如何在java中執行此查詢?

Java代碼

public ArrayList<cashObject> getCashbookData(String date) { 
     ArrayList<cashObject> results = new ArrayList<>(); 
     try { 
      conn c = new conn(); 
      String query = "DROP TABLE IF EXISTS tmp_acc;\n" 
        + "DROP TABLE IF EXISTS tmp_loan;\n" 
        + "    \n" 
        + " CREATE \n" 
        + " TEMPORARY TABLE \n" 
        + " IF NOT EXISTS \n" 
        + "    tmp_acc AS \n" 
        + "    (SELECT\n" 
        + "    ac.date,\n" 
        + "    COALESCE((SELECT SUM(cash) FROM accounts WHERE MONTH(date) = MONTH(ac.date - INTERVAL 1 MONTH) AND YEAR(date) = YEAR(ac.date - INTERVAL 1 YEAR)), 0)AS op_cash,\n" 
        + "    COALESCE((SELECT SUM(bank) FROM accounts WHERE MONTH(date) = MONTH(ac.date - INTERVAL 1 MONTH) AND YEAR(date) = YEAR(ac.date - INTERVAL 1 YEAR)),0)AS op_bank,\n" 
        + "    COALESCE((SELECT SUM(ho_funds) FROM accounts WHERE date = ac.date), 0)AS ho_funds,\n" 
        + "    COALESCE((SELECT SUM(recieved) FROM funds WHERE date = ac.date AND branch_to = 'kandy' AND method = 'Cash'),0)AS funds_cash,\n" 
        + "    COALESCE((SELECT SUM(recieved) FROM funds WHERE date = ac.date AND branch_to = 'kandy' AND method = 'Bank'),0)AS funds_bank,\n" 
        + "    COALESCE((SELECT SUM(diposit) FROM bank WHERE date = ac.date),0)AS diposits,\n" 
        + "    COALESCE((SELECT SUM(withdraw) FROM bank WHERE date = ac.date),0)AS withdrawals\n" 
        + "    FROM accounts ac);\n" 
        + "    \n" 
        + "    CREATE \n" 
        + "    TEMPORARY TABLE \n" 
        + "    IF NOT EXISTS \n" 
        + "    tmp_loan AS \n" 
        + "    SELECT ls.date, COUNT(l.idloan)AS count, l.interest,l.admission_fee,l.document_fee,l.insuarance,\n" 
        + "    \n" 
        + "    (SELECT SUM(d1.overdue) FROM daily_collections d1 WHERE d1.loan_idloan = l.idloan)AS overdue_collection,\n" 
        + "    ls.completed_date\n" 
        + "    FROM loan l \n" 
        + "    LEFT OUTER JOIN daily_collections d ON l.idloan = d.loan_idloan \n" 
        + "    JOIN loan_session ls ON ls.loan_idloan = l.idloan\n" 
        + "    WHERE ls.completed = 'Yes'\n" 
        + "    GROUP BY ls.completed_date,l.interest;\n" 
        + "    \n" 
        + "    SELECT\n" 
        + "    a.date,COALESCE(a.op_cash,0)AS op_cash,COALESCE(a.op_bank,0)AS op_bank, COALESCE(a.ho_funds,0)AS ho_funds,\n" 
        + "    COALESCE(a.funds_cash,0)AS funds_cash, COALESCE(a.funds_bank,0)AS funds_bank,COALESCE(a.diposits,0)AS diposits, COALESCE(a.withdrawals,0)AS withdrawals,\n" 
        + "    COALESCE(l.count,0)AS count, COALESCE(l.interest,0)AS interest, COALESCE(l.admission_fee,0)AS admision_fee,\n" 
        + "    COALESCE(l.document_fee,0)AS document_fee, COALESCE(l.insuarance,0)AS insrance, COALESCE(l.overdue_collection,0)AS overdue_collection\n" 
        + "    FROM tmp_acc a \n" 
        + "    LEFT OUTER JOIN tmp_loan l ON a.date = l.completed_date\n" 
        + "    WHERE MONTH(a.date) = '" + date + "' "; 

      Statement st = c.getConnection().createStatement(); 
      ResultSet rs =st.executeQuery(query); 

      System.out.println("RS :: " + rs); 

      while (rs.next()) { 

       cashObject o = new cashObject(); 
       o.setDate(rs.getString(0)); 
       o.setOp_cash(parseDouble(rs.getString(1))); 
       o.setOp_bank(parseDouble(rs.getString(2))); 
       o.setHo_funds(parseDouble(rs.getString(3))); 
       o.setFunds_cash(parseDouble(rs.getString(4))); 
       o.setFunds_bank(parseDouble(rs.getString(5))); 
       o.setDiposits(parseDouble(rs.getString(6))); 
       o.setWithdrawals(parseDouble(rs.getString(7))); 
       o.setCount(parseInt(rs.getString(8))); 
       o.setInterest(parseDouble(rs.getString(9))); 
       o.setAdmission_fee(parseDouble(rs.getString(10))); 
       o.setDocument_fee(parseDouble(rs.getString(11))); 
       o.setInsuarance(parseDouble(rs.getString(12))); 
       o.setOverdueCollection(parseDouble(rs.getString(13))); 
       results.add(o); 
      } 
     } catch (SQLException e) { 
      logger.error(e.getMessage()); 
     } 
     // print size of arraylist 
     System.out.println("CLASS : " + results.size()); 
     return results; 
    } 
+1

由於我們沒有你聲稱不工作的Java代碼,誰知道?你有沒有試過調試你的代碼? – jdv

+0

謝謝@jdv,我加了java代碼 –

+0

你真的在使用JasperReports嗎?如果您使用JR,那麼使用Statement.executeQuery()的原因是什麼? –

回答

0

使用缺省配置,不能執行多個語句一樣,因爲聲明的目的是執行一個語句,而不是一個腳本。

你需要在你的腳本單獨或者執行了五點聲明,所以

statement.execute("drop table ..."); 
statement.execute("drop table ..."); 
statement.execute("create temporary table ..."); 
statement.execute("create temporary table ..."); 
ResultSet rs = statement.executeQuery("select ..."); 

,你可以嘗試使用MySQL特定的連接屬性allowMultiQueries=true;這將允許您執行多個語句。它的行爲在技術上不被JDBC標準所允許,我不知道它是否適用於這個特定的例子。

+0

謝謝@Mark Rotterveel。我會嘗試的。 –

+0

非常感謝你@Mark Rotteveel。這工作正常 –