2013-05-30 31 views
0

這個問題似乎與setInt和setString方法中的'generic'語法有關。 - 當然,也可能是其他問題,但讓我告訴你我發現了什麼。我給出一個空的resultSet。我的JTable是空的。它不應該是

下面是我在mySql中的表,我試圖用java查詢。

Id | CashFlowSensitive | Sp1 
----------------------------------- 
    37 |     1 | Hello 
1000 |     0 | Hello 
1401 |     0 | number3 
1500 |     0 | number4 
1504 |     1 | Hello 

如果我這樣的代碼「給我哪裏CashFlowSensitive = 1和Sp1的=所有行‘你好’,然後我的代碼工作。它給了我第一行和最後一行,因爲它們完全符合過濾標準。

現在,假設我更改了表中的最後一行,替換number5Hello條目。然後,將表看起來像這樣

Id | CashFlowSensitive | Sp1 
----------------------------------- 
    37 |     1 | Hello 
1000 |     0 | Hello 
1401 |     0 | number3 
1500 |     0 | number4 
1504 |     1 | number5 

最後我啓動我的查詢,詢問它給我的所有行「CashFlowSensitive」 = 1 我應該得到37和1504 可悲的是,這給出了一個空結果。我的JTable是空的。 在這個失敗的例子,我做的事:

public void searchStringTest(DefaultTableModel model, Database db, int CashFlowSensitive, String Sp1) 
{ 
    int first = -77; 
    String second = "-55"; 

    String queryTest = " select * from helm.activitiesextended where CashFlowSensitive = ? and Sp1 = ? "; 

    try 
    { 
     java.sql.PreparedStatement selectStmt = CON.prepareStatement(queryTest); 

     if (first == -77) { 
      ((PreparedStatement) selectStmt).setInt(1, 1); 
     } else { 
      ((PreparedStatement) selectStmt).setInt(1, '%' + CashFlowSensitive + '%');  
     } 

     if (second == "-77") { 
      ((PreparedStatement) selectStmt).setString(2, "Hello"); 
     } else { 
      ((PreparedStatement) selectStmt).setString(2, "%" + Sp1 + "%"); 
     }    

     ResultSet rsTest = selectStmt.executeQuery(); 

     model.setRowCount(0);   

     while (rsTest.next())    
     { 
      Vector <Object> vector = new Vector<Object>(); 
      for (int columnIndex = 1; columnIndex <=4; columnIndex ++) 
      { 
       vector.add(rsTest.getObject (columnIndex));// pick next column 
      } 
      data.add(vector); 

      model.addRow(vector); 
     } 

我有一個搜索聲明爲 (INT CFS,INT ToBeMonitored,字符串SP1中,字符串SP2中,字符串SP3和加法7個PARAMATERS) 我定義我的查詢字符串: select * from CFS =?和ToBeMonitored =?和Sp1 =?和Sp2 =?和Sp3 =?枚舉十個參數。 現在,在這個查詢的任何給定運行中,我只激活最多4個參數,例如說我想過濾掉2個參數:CFS和Sp1,其餘參數對過濾過程應該是中性的,我稱之爲「中性」。 ((PreparedStatement)selectStmt).setInt(1,1); //在這一個過濾 ((PreparedStatement)selectStmt).setInt(2,'%'+ ToBeMonitored +'% 「); //(接受任何值) ((PreparedStatement)selectStmt).setString(3,「Hello」); //過濾這一個 ((PreparedStatement)selectStmt).setString(4,「%」+ Sp2 +「%」) ; ((PreparedStatement)selectStmt).setString(5,「%」+ Sp3 +「%」); 正如你所看到的,我將我的sql定位爲參數1和3,同時忽略了其他參數,這使得它們在過濾過程中保持中立。問題:儘管有效數據,仍然沒有創建結果集。

你的回答有點偏離我提出的問題。我希望您尊重這樣一個事實,即無論在每次單獨運行時要過濾哪個參數,都會一次又一次保留相同的查詢字符串。例如,如果我只'打開'CashFlowSensitive標誌,那麼在運行查詢時該特定參數應該是活動參數。其他參數對濾波過程應以中性方式運行。在其他時間,我可以選擇激活Sp1字段(CHAR字段),然後其他字段應該處於休眠狀態。在其他情況下,我可能會選擇幾個領域的組合,這些應該是積極的,沒有選擇的領域應該是中立的。 讓我減少你的任務範圍。 1)告訴我如何在過濾過程中使用綁定參數來查詢CHAR字段,換言之,應該接受任何內容2)您還可以告訴我如何檢查軟件生成的查詢字符串

回答

1

問題是傳入else路徑中第二個參數的值。您的最終查詢將如下所示:

select * from helm.activitiesextended 
where CashFlowSensitive = 1 and Sp1 = '%<value of Sp1>%' 

這顯然沒有返回任何記錄。如果你只需要那個參數,你應該只查詢第一個參數。例如:

select * from helm.activitiesextended where CashFlowSensitive = 1 
相關問題