需要帮助在java中对来自DB的记录进行分组

时间:2012-09-03 10:58:16

标签: java collections

我的结果如下:

tablename   columnname     size    order
employee    name            25      1
employee    sex             25      2
employee    contactNumber   50      3
address     name            25      4
address     street          25      5
address     country         25      6

这是我根据table name

对值进行分组的java代码
public void getReportQuery() {
    String tablename="",columnname="";
    int size=0,order=0;
    boolean isCustomised=true;
    StringBuffer sb = new StringBuffer();
    Map<String, Map<String, String>> reportQueryMap = new HashMap<String, Map<String, String>>();
    List<String> reportQueryTableNameList = new ArrayList<String>();
    Connection connection = getConnection();
    if (connection != null) {
       try {
         sb.append("SELECT rmaster.tablename,rmaster.columnname,r.size,r.order FROM report_customise_child r,report_customise_master rmaster where r.isactive='y' and rmaster.id=r.masterid; ");
         PreparedStatement reportQueryPS = connection.prepareStatement(sb.toString());
                ResultSet reportQuery_rst= reportQueryPS.executeQuery();
    if(reportQuery_rst!=null){
     while (reportQuery_rst.next()) {
       tablename = reportQuery_rst.getString("tablename");
        if (!reportQueryTableNameList.contains(tablename)) {
            reportQueryTableNameList.add(tablename);
        System.out.println("tablename : "+tablename);
                        }
                            columnname = reportQuery_rst.getString("columnname");
                            System.out.println(" columnname : "+columnname);

                            //size = reportQuery_rst.getInt("size");
                            //order = reportQuery_rst.getInt("order");
                  }
                }else{
                    isCustomised=false;
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            } finally {
                try {
                    closeConnection(connection, null, null);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        } else {
            System.out.println("Connection not Established. Please Contact Vendor");
        }
    }

我真的不知道如何对值进行分组,我想从上面的结果中构建查询,如。

请帮我分组我将从分组值中查询查询的值。

我需要分组如下

tablename1
columnmaes

tablename2
columnnames

tablenameN
columnnames

请帮我实现这个目标,

此致

1 个答案:

答案 0 :(得分:1)

您可以拥有Map<String, List<String>>,其中key是表名,value是列名列表。

Map<String, List<String>> resultsMap = new HashMap<String, List<String>>();
ResultSet reportQuery_rst= reportQueryPS.executeQuery();
if(reportQuery_rst!=null){
   while (reportQuery_rst.next()) {
      String tableName = reportQuery_rst.getString("tablename");
      List<String> columns = resultsMap.get(tableName); 
      if(columns == null ) { 
          columns = new ArrayList<String>();
          resultMap.put(tableName, columns);
      }
      columns = resultsMap.get(tableName);
      String columnName = reportQuery_rst.getString("columnname");
      columns.add(columnName);
   }
}

现在resultsMap将拥有tableNames和ColumnNames。 如果要存储其他信息(如顺序和大小),则需要创建一个bean并将其存储在像Map<String, List<YourBean>>这样的表名中。

<强>更新

现在,您希望使用此resultMap

中的不同表名准备不同的查询
List<String> queries = new ArrayList<String>();
for(Entry<String, List<String>> resultEntry : resultMap.entrySet()) {
   String tableName = resultEntry.getKey();
   List<String> columns = resultEntry.getValue();
   StringBuilder query = new StringBuilder(" select ");
   int i = 0;
   for(String column : columns) {
       query.append(column);
       if(i != columns.size()) {
          query.append(", ");
       } 
       i++;
   }
   query.append(" from ").append(tableName);
   queries.add(query.toString());
} 

现在queries将包含所有必需的查询,因为您有多个查询,您需要处理Connection pooling和所有问题,尝试使用JDBC Templates这样的内容常见的所需操作,如DataSource, Connection pool, Automatic Bean Mapping等。 希望这有助于你。