5

レコード ID がリストにないデータベースからレコードを選択しようとしています。

以下の@私の問題を見てください。

String Sqlids = "2,6,3,9"; // this is dynamic so the number of element is unknown

String str= "SELECT TOP 1 * FROM student WHERE ID NOT IN (2,6,3,9) ORDER BY NEWID()";
PreparedStatement stat = con.prepareStatement(str);
ResultSet rs = stat.executeQuery();

上記のステートメントは正常に機能しますが、変更すると

String Sqlids = "2,6,3,9";
String str= "SELECT TOP 1 * FROM student WHERE ID NOT IN (Sqlids) ORDER BY NEWID()";
PreparedStatement stat = con.prepareStatement(str);
ResultSet rs = stat.executeQuery();

//i also try this
String Sqlids = "2,6,3,9";
String str= "SELECT TOP 1 * FROM student WHERE ID NOT IN (?) ORDER BY NEWID()";
PreparedStatement stat = con.prepareStatement(str);
stat.setString(1,Sqlids );

ResultSet rs = stat.executeQuery();

上記のステートメントはフィルター処理されません Sqlids は 1 つの文字列であり、それを 1 つのパラメーターとして認識しているため、繰り返し行を返すため、 2,6,3,9 のような値を格納するための整数形式はありますか? Sqlids は SqlidList という配列リストからのものであるため、このように somtin を試します

Iterator iTr = SqlidList.iterator();
while(iTr.hasNext()){
    stat.setString(1,iTr.next().toString()+",");
}

しかし、setString(1,--) は while ループにあるため使用できません

4

3 に答える 3

6

ID を String[] に変換した後、Connection#createArrayOfを使用します。

String[] ids = {"2", "6", "3", "9"};

String str= "SELECT TOP 1 * FROM student WHERE ID NOT IN ? ORDER BY NEWID()";
PreparedStatement stat = con.prepareStatement(str);
stat.setArray(1, con.createArrayOf("text",ids));
ResultSet rs = stat.executeQuery();

createArrayOf が JDBC ドライバーでサポートされていない場合 (この場合のように)、おそらくクエリ文字列をその場で構築するだけです。

String Sqlids = "2,6,3,9";
String str= "SELECT TOP 1 * FROM student WHERE ID NOT IN ("+Sqlids+") ORDER BY NEWID()";

または、id のコレクションがある場合は、ユーティリティ メソッドを使用して配列の内容を作成します。

public static String toSqlArray(List<String> strings) {
    StringBuilder sb = new StringBuilder();
    boolean doneOne = false;
    for(String str: strings){
        if(doneOne){
            sb.append(", ");
        }
        sb.append("'").append(str).append("'");
        doneOne = true;
    }
    return sb.toString();
}
于 2012-10-24T11:07:26.667 に答える
2

私が問題を解決した方法は次のとおりです。

  1. SQL = "...WHERE ID NOT IN ({0}) ..."

  2. ? の数を含む文字列を作成するメソッドがあります。SqlidList のサイズに等しい

    public static String buildQuestionMarks(final int count) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < count; i++) {
       sb.append("?" + ",");
    }
    return sb.substring(0, sb.length() - 1);
    

    }

  3. のリストを挿入するには、java.text.MessageFormat.format() を使用します。SQL 文字列に finalSql = MessageFormat.format(SQL, questionMarksString);

  4. 準備されたステートメントにパラメーターを設定する方法があります。stat.setString() の最初のパラメーターをインクリメントする必要がありますが、あなたが書いたものに似たもの

これは、可変数のパラメーターに対して機能するはずです。

于 2012-10-24T10:39:28.040 に答える
1

使ってみましたか

    int[] array = {2,6,3,9};
    String str= "SELECT TOP 1 * FROM student WHERE ID NOT IN (?,?,?,?) ORDER BY NEWID()";
    PreparedStatement stat = con.prepareStatement(str);
    for(int i = 1; i <= array.length; i++)
        stat.setString(i,array[i - 1]);

    ResultSet rs = stat.executeQuery();
于 2012-10-24T10:21:49.523 に答える