2014-10-11 74 views
0

加入2個表格有一個奇怪的問題。在Java中,查詢不起作用,它只會重複打印一行,但在MySQL查詢中它工作正常。我需要這些數據來寫入一個json文件。我該如何解決這個問題?請幫忙。注:表中查找看到鏈接:Need to join 2 tables but except some rows in another table in MySQL在Java中,查詢不起作用,但在MySQL中它工作正常,我該如何解決這個問題?

這裏是我的代碼:

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.Statement; 
import java.util.ArrayList; 
import java.util.List; 
import org.json.JSONObject; 
import org.json.simple.JSONArray; 

public class ShowData { 
     public void Display(){ 
     try{ 
      DBConnect2 dc = new DBConnect2(); 
      PreparedStatement ps = null; 
      ResultSet rs = null; 
      Statement st= null; 
      BufferedWriter wr1 = new BufferedWriter(new FileWriter(new File("E:/workspace/Test/input/display.json"))); 
      String query5 = "SELECT DISTINCT k.source, k.target, k.frequency FROM links k " 
        + "LEFT JOIN logs g ON g.id = k.id " 
        + "WHERE IFNULL(status, '') != 'Delete Edge' " 
        + "AND 'Bush' IN(k.source, k.target)"; 

      ps = dc.getCon().prepareStatement(query5); 
      rs = ps.executeQuery(); 
      JSONObject obj = new JSONObject(); 
      JSONObject obj1 = new JSONObject(); 
      JSONArray list = new JSONArray(); 
      while(rs.next()){ 
        obj1.put("source", rs.getString("source")); 
        obj1.put("target", rs.getString("target")); 
        obj1.put("frequency", rs.getInt("frequency")); 
        list.add(obj1); 
      } 
      obj.put("links", list); 
      wr1.write(obj.toString() + "\n"); 
      wr1.flush(); 
      System.out.println("Done"); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(final String[] args){ 
      ShowData sw = new ShowData(); 
      sw.Display(); 
    } 
} 
+1

'JSONObject obj1 = new JSONObject();'應該在'while'循環中進入。 – blackSmith 2014-10-11 09:21:33

+0

看到這篇文章http://stackoverflow.com/questions/24826029/what-simple-db-solution-do-i-use-to-extract-my-parsed-variables-from-eclipse-to/24826365#24826365 – Jimmysnn 2014-10-11 09:21:43

回答

2

這個問題似乎就在這裏

JSONObject obj = new JSONObject(); 
JSONObject obj1 = new JSONObject(); 
JSONArray list = new JSONArray(); 
while(rs.next()){ 
    obj1.put("source", rs.getString("source")); 
    obj1.put("target", rs.getString("target")); 
    obj1.put("frequency", rs.getInt("frequency")); 
    list.add(obj1); 
} 

你正在創建obj1一次和寫作每一行的內容。 JSONObject就像一張地圖,如果您將新數據寫入現有密鑰,新數據將覆蓋舊數據。所以你的循環會一遍又一遍地覆蓋舊數據,直到達到最後一行。因此在循環之後只有最後一行的內容可用。

要解決它,移動obj1進入循環:

JSONObject obj = new JSONObject(); 
JSONArray list = new JSONArray(); 
while(rs.next()) { 
    final JSONObject obj1 = new JSONObject(); 
    obj1.put("source", rs.getString("source")); 
    obj1.put("target", rs.getString("target")); 
    obj1.put("frequency", rs.getInt("frequency")); 
    list.add(obj1); 
} 

現在你在每次迭代中創建的JSONObject一個新實例,當前行的數據存儲到它,這種情況下添加到JSONArray

相關問題