2014-10-11 80 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

相关问题