2016-12-30 2 views
0

Я делаю SQL запрос с использованием ядра Java на трех различных таблиц с LEFT JOIN и получить следующий вывод:Как эффективно группировать вывод SQL-запросов с помощью Java?

pId pName sId sName gId gName 
1 p1  11 s1  111 g1 
1 p1  11 s1  112 g2 
2 p2  12 s2  null null 
3 p3  13 s3  113 g3 

Теперь я хочу, чтобы сгруппировать это следующим образом:

[{ 
    "pId": 1, 
    "pname": "p1", 
    "sub": [{ 
     "sId": 11, 
     "sName": "s1", 
     "grades": [{ 
      "gId": 111, 
      "gName": "g1" 
     }, { 
      "gId": 112, 
      "gName": "g2" 
     }] 
    }] 
}, { 
    "pId": 2, 
    "pname": "p2", 
    "sub": [{ 
     "sId": 12, 
     "sName": "s2", 
     "grades": [] 
    }] 
}, { 
    "pId": 3, 
    "pname": "p3", 
    "sub": [{ 
     "sId": 13, 
     "sName": "s3", 
     "grades": [{ 
      "gId": 113, 
      "gName": "g3" 
     }] 
    }] 
}] 

К группе, как указано выше вышеупомянутый выход, я делаю следующий процесс в моем коде Java:

1) Перебрать все Pid

2) Перебрать все Sid в Pid

3) Перебрать все GID в Sid

Это занимает много времени, чтобы выполнить и получить желаемый результат.

Есть ли способ сделать это быстрее с минимальными итерациями?

Любая помощь/временное решение будет принята с благодарностью.

Я попытался HashMap над Pid, ​​но до сих пор не удалось найти решение

+2

пример кода может помочь. – Sid

+3

Просто «закажите по pId, pname, sId, sName» в вашем SQL. Тогда вы можете легко создать JSON с помощью одного прохода через данные. –

+0

@JackManey Точно сделал это, но все же мне нужно перебирать все строки, которые я получаю в результате запроса. – Vishwas

ответ

1

Создание объекта, как показано ниже

public class Process{ 

     // getters and setters 
     private int pid; 

     // getters and setters 
     private String pName; 

     // getters and setters 
     private List<SubProcess> subList; 

     // override equals and hashcode basd on process name and id 

    } 

    public class SubProcess{ 

     // getters and setters 
     private int subProcessId; 
     // getters and setters 
     private String subProcessName; 
     // getters and setters 
     private List<Grade> gradeList; 

     // override equals and hashcode basd on sub process name and id 


    } 

    public class Grade{ 

     // getters and setters 
     private int gradeId; 
     // getters and setters 
     private String gradeName; 

    } 

Теперь перебирать результирующего набора и заселить эти объекты, создающие список проверяет процессы при добавлении нового процесса, независимо от того, существует ли процесс ... если это так, повторите проверку для подпроцесса и оценки, добавляя данные только в том случае, если они являются новыми.

1

Расширяя answer by prashant

Псевдо-код:

String sql = "SELECT pId, pName, sId, sName, gId, gName" + 
       " FROM ..." + 
       " LEFT JOIN ..." + 
      " WHERE ..." + 
      " ORDER BY pId, sId, gId"; // <-- IMPORTANT !!! 
rs = stmt.executeQuery(sql) 

List<Process> processes = new ArrayList<>(); 
Process p = null; 
SubProcess s = null; 
while (rs.next()) { 
    if (p == null || p.getId() != rs.getInt("pId")) { 
     p = new Process(rs.getInt("pId"), rs.getString("pName")); 
     processes.add(p); 
     s = null; // force new SubProcess 
    } 
    if (rs.getInt("sId") == 0/*null*/) 
     continue; // skip, no SubProcess found for Process 
    if (s == null || s.getId() != rs.getInt("sId")) { 
     s = new SubProcess(rs.getInt("sId"), rs.getString("sName")); 
     p.addSubProcess(s); 
    } 
    if (rs.getInt("gId") == 0/*null*/) 
     continue; // skip, no Grade found for SubProcess 
    Grade g = new Grade(rs.getInt("gId"), rs.getString("gName")); 
    s.addGrade(g); 
} 
// Now generate JSON from 'processes' list