Java Struts报告

我正在写一个使用action,controller,servlet struts框架的excel报告。 该报告非常拥挤,已经有大约10个不同的查询。 由于报告中的更改,我需要再添加约10个查询。 有没有办法做到这一点,而不必保持嵌套结果集? 以下是现有的代码。

public TotalSalesKPIContainer totalSalesKPIQuery(String franchiseId, java.util.Date startDate, java.util.Date stopDate) { String getFranIds = null; ArrayList storeResultList = new ArrayList(); ArrayList salesPersonResultList = new ArrayList(); TotalSalesKPIContainer result = null; Connection conn = null; PreparedStatement pstmt1, pstmtLY, pstmtCountLY, pstmtTCount, pstmtTCountLY, pstmtCount = null; PreparedStatement pstmt, ps = null; ResultSet rs1, rsLY, rsCountLY, rsTCount, rsTCountLY, rsCount = null; ResultSet rs = null, rsSP = null, rsBySP, rsTCount2, rsTCountLY2 = null, rsBySPLY, rsCountLY2, rsCount2; java.util.Date prevStartDate; java.util.Date prevStopDate; try { conn = getConnection(); if (franchiseId.equals("0")) { getFranIds = "Select id, name from vymac.organization"; pstmt = conn.prepareStatement(getFranIds); } else { getFranIds = "Select id, name from vymac.organization where id = ? "; pstmt = conn.prepareStatement(getFranIds); pstmt.setString(1, franchiseId); } int franID = Integer.parseInt(franchiseId); rs = pstmt.executeQuery(); while (rs.next()) { result = new TotalSalesKPIContainer(rs.getString(2), franID,startDate, stopDate, storeResultList,salesPersonResultList); /* * This section is for Salesperson total sales */ pstmt1 = conn.prepareStatement(getTotalSalesBySP); pstmt1.setInt(1, rs.getInt(1)); pstmt1.setDate(2, new java.sql.Date(startDate.getTime())); pstmt1.setDate(3, new java.sql.Date(stopDate.getTime())); rsBySP = pstmt1.executeQuery(); while (rsBySP.next()) { ps = conn.prepareStatement(getSalesPersons); ps.setInt(1, rsBySP.getInt(1)); rsSP = ps.executeQuery(); if (rsSP.next()) { ps = conn.prepareStatement(getPrevTotalSalesBySP); // Get previous year date Calendar cal = Calendar.getInstance(); cal.setTime(startDate); cal.add(Calendar.YEAR, -1); prevStartDate = cal.getTime(); cal.setTime(stopDate); cal.add(Calendar.YEAR, -1); prevStopDate = cal.getTime(); ps.setString(1, rsBySP.getString(1)); ps.setDate(2,new java.sql.Date(prevStartDate.getTime())); ps.setDate(3, new java.sql.Date(prevStopDate.getTime())); rsBySPLY = ps.executeQuery(); if (rsBySPLY.next()) { // Count Invoices for Last Year ps = conn.prepareStatement(findCountBySP); ps.setDate(1, new java.sql.Date(prevStartDate.getTime())); ps.setDate(2, new java.sql.Date(prevStopDate.getTime())); ps.setString(3, rsBySP.getString(1)); rsCountLY2 = ps.executeQuery(); if (rsCountLY2.next()) { ps = conn.prepareStatement(findCountBySP); ps.setDate(1, new java.sql.Date(startDate.getTime())); ps.setDate(2, new java.sql.Date(stopDate.getTime())); ps.setString(3, rsBySP.getString(1)); rsCount2 = ps.executeQuery(); if (rsCount2.next()) { ps = conn.prepareStatement(trafficCountBySP); ps.setDate(1, new java.sql.Date(startDate.getTime())); ps.setDate(2, new java.sql.Date(stopDate.getTime())); ps.setString(3, rsBySP.getString(1)); rsTCount2 = ps.executeQuery(); if (rsTCount2.next()) { ps = conn.prepareStatement(trafficCountBySP); ps.setDate(1, new java.sql.Date(prevStartDate.getTime())); ps.setDate(2, new java.sql.Date(prevStopDate.getTime())); ps.setString(3, rsBySP.getString(1)); rsTCountLY2 = ps.executeQuery(); if (rsTCountLY2.next()) { TotalSalesInformationBySalesPerson tbsp = new TotalSalesInformationBySalesPerson(rsSP.getString(1), rs.getString(2), rs.getInt(1),rsCount2.getInt(1), rsBySP.getDouble(2),rsBySPLY.getDouble(2),rsCountLY2.getInt(1), rsTCount2.getInt(1),rsTCountLY2.getInt(1)); salesPersonResultList.add(tbsp); } else { TotalSalesInformationBySalesPerson tbsp = new TotalSalesInformationBySalesPerson( rsSP.getString(1), rs .getString(2), rs .getInt(1), rsCount2.getInt(1), rsBySP .getDouble(2), rsBySPLY.getDouble(2), rsCountLY2.getInt(1), rsTCount2.getInt(1), 0); salesPersonResultList.add(tbsp); } } } } } else { ps = conn.prepareStatement(findCountBySP); ps.setDate(1, new java.sql.Date(startDate.getTime())); ps .setDate(2, new java.sql.Date(stopDate .getTime())); ps.setString(3, rsBySP.getString(1)); rsCount2 = ps.executeQuery(); if (rsCount2.next()) { ps = conn.prepareStatement(trafficCountBySP); ps.setDate(1, new java.sql.Date(startDate .getTime())); ps.setDate(2, new java.sql.Date(stopDate .getTime())); ps.setString(3, rsBySP.getString(1)); rsTCount2 = ps.executeQuery(); if (rsTCount2.next()) { TotalSalesInformationBySalesPerson tbsp = new TotalSalesInformationBySalesPerson( rsSP.getString(1), rs.getString(2), rs.getInt(1), rsCount2.getInt(1), rsBySP.getDouble(2), 0.00, 0, rsTCount2.getInt(1), 0); salesPersonResultList.add(tbsp); } else { TotalSalesInformationBySalesPerson tbsp = new TotalSalesInformationBySalesPerson( rsSP.getString(1), rs.getString(2), rs.getInt(1), rsCount2.getInt(1), rsBySP.getDouble(2), 0.00, 0, rsTCount2.getInt(1), 0); salesPersonResultList.add(tbsp); } } } } } 

看起来你正在代码中进行连接,即执行一个查询,并返回每条logging,对这些数据执行查询。 然后实际上嵌套更多这样的查询。

通常可以在数据库中进行更多的连接工作,但是如果不看数据库模式并理解代码的含义,我认为我们不会有更多的帮助。

我build议你只考虑问题的一个层次,并考虑是否可以表示为单个查询,还是联合一些相关的查询。 然后从那里build立。

另外,你可以对Java进行重新组织和重构,使其更易于理解,将子查询抽出到自己的函数中,但希望不要像这样嵌套代码。