2017-04-04 6 views
0

Javaでサブクエリを実装しています。この場合、準備されたステートメントを使用して2つのパラメータを入力する必要があります。Javaのプリペアドステートメントのサブクエリの外部テーブルにパラメータを渡す

内部クエリ内のパラメータの受け渡しは機能していますが、外側のパラメータにはパラメータが渡されません。

実行中にstacktraceに次のようなエラーが表示されます。したがって、準備されたステートメントは間違ったresults.Questionを返します。どのように最善の方法は、正常に外側のテーブルにパラメータを渡すことができます。以下は

ここに私の実装のサンプルコード

pst = conn.prepareStatement("SELECT slot.time_slot_id,slot.`date`,slot.count FROM 
    (SELECT time_slot_id,ue.`date`,COUNT(ue.user_id) AS count FROM user_event ue 
    RIGHT JOIN `time_slot` t ON ue.time_slot_id = t.id 
    WHERE ue.status= 1 AND event_id=? 
    GROUP BY ue.`date`,time_slot_id 
) AS slot WHERE slot.count >=? "); 

pst.setInt(1,eventId); 
//here is the parameter that is passed to the outer table 
pst.setInt(2,count); 
rs = pst.executeQuery(); 

が全体の方法として、以下の実施していますのアップデートです。

public static DefaultListModel Fetch(int eventId){ 
    DBconnection.connect(); 
    DefaultListModel fetchedSlots= new DefaultListModel(); 
    try{ 
     // 
     pst = conn.prepareStatement("SELECT slot.time_slot_id,slot.`date`,slot.count FROM \n" + 
     "(SELECT time_slot_id,ue.`date`,COUNT(ue.user_id) AS count FROM user_event ue \n" + 
     "RIGHT JOIN `time_slot` t ON ue.time_slot_id = t.id\n" + 
     "WHERE ue.status= 1 AND event_id=?\n" + 
     "GROUP BY ue.`date`,time_slot_id) AS slot\n" + 
     "WHERE slot.count >? "); 
     pst.setInt(1,eventId); 
     //here a function is invocked using eventId to get counts 
     pst.setInt(2,FetchCounts(eventId)); 
     rs = pst.executeQuery(); 
     while(rs.next()){ 
      fetchedSlots.addElement(new ModelSlot(rs.getInt("time_slot_id"),rs.getString("date"))); 
     } 
    DBconnection.CloseConnection(); 
    }catch (SQLException ex){ 
     System.out.println(ex.getMessage()); 
    } 
    return fetchedSlots; 
} 
+0

これは、PHPとJavaコードの混乱のように見えます。実際のJavaコードを投稿してください。 – john16384

+1

あなたが言及しているエラーは、サブクエリのパラメータが許可されていないため決してありません。 Plsはこのエラーが発生した行を含め、完全なコードを投稿します。 – dev8080

+0

あなたは私たちにあなたの接続を開いたり閉じたりするときのエラーと他のコードを教えてください。 –

答えて

0

私は、エラーが、このような場合に起こることを前提としています

Open statement 
... 
Use statement 
... 
Close statement   <---------- You can't use your statement after close it 
... 
Use same statement again <---------- You are here, your statement is close 

あなたの問題を解決するには次の2つの選択肢があります。

  • は、あなたの仕事の終わりに文を閉じますあなたはこれを確認することができますClosing Database Connections in Java
  • statement = connection.createprePareStatement();
  • のような新しい声明を開きます実際に

    pst.setInt(2, FetchCounts(eventId)); 
    //---------------^^^ 
    

    このオープン新しい接続し、最後にそれを閉じる:私は前にも言ったように

EDIT

、あなたの問題は、このメソッドを呼び出したときに、接続していますしたがって、rs = pst.executeQuery();というクエリを実行すると、接続が閉じられ、この問題が発生するため、は、メソッドFetchCounts(T eventId);の接続を閉じません。

+0

@ YCF_L.iには、データベース接続をオープンおよびクローズするための1つのクラス、つまり接続の実装を開くためのDBconnection.connect()とDBconnection.CloseConnection()があります。閉鎖のために。 – Ford

+0

いいえ@Ford接続されていません。閉じるか開いているかを確認してください –

+0

チップには@YCF_Lが大丈夫です – Ford

0

試行後、前回よりも準備されたステートメントに第2パラメータを連結していました。下記の通り ;上記

pst = conn.prepareStatement("SELECT 
slot.time_slot_id,slot.`date`,slot.count FROM \n" + 
     "(SELECT time_slot_id,ue.`date`,COUNT(ue.user_id) AS count FROM user_event ue \n" + 
     "RIGHT JOIN `time_slot` t ON ue.time_slot_id = t.id\n" + 
     "WHERE ue.status= 1 AND event_id=?\n" + 
     "GROUP BY ue.`date`,time_slot_id) AS slot\n" + 
     "WHERE slot.count >" + FetchCounts(eventId)); 
     pst.setInt(1,eventId); 
     rs = pst.executeQuery(); 

明らかなように、呼び出されたメソッドFetchCounts(eventId)の結果が準備されたステートメント内のサブクエリ外側テーブルに直接渡されます。

関連する問題