0

問題は、setInt および setString メソッドの「一般的な」構文にあるようです。-もちろん、他の問題もあるかもしれませんが、私が見つけたことをお話ししましょう。

以下は、Javaを使用してクエリしようとしているmySqlのテーブルです。

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

「CashFlowSensitive=1 で Sp1 = “Hello” の行をすべて教えてください」のようにコーディングすると、私のコードは機能します。フィルタリング基準に正確に対応するため、最初と最後の行が表示されます。

ここで、テーブルの最後の行を変更して、 のHelloエントリを置き換えたとしnumber5ます。するとテーブルはこんな感じ

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、String Sp1、String Sp2、String Sp3、および追加の 7 つのパラメーター) として宣言された searchString があります。クエリ文字列を次のように定義しました: select * from table where CFS = ? およびToBeMonitored = ? Sp1=?Sp2=?Sp3=?など、10 個のパラメーターを列挙します。ここで、このクエリの任意の実行時に、最大 4 つのパラメーターのみをアクティブにします。たとえば、2 つのパーを除外したいとします: CFS と Sp1、残りのパラメーターはフィルタリング プロセスに対してニュートラルである必要があります。これを 'neutral' と呼びます。そうすることで、準備済みステートメントをセットアップします ((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 + "%"); ご覧のとおり、他のパラメーターを無視してパラメーター 1 と 3 を尊重するように SQL を強制しています。これは、フィルタリング プロセスでそれらを中立にするようなものです。問題: 有効なデータにもかかわらず、結果セットが作成されません。

あなたの答えは、私が提起した質問から少し外れています。個別の実行ごとにフィルター処理するパラメーターに関係なく、同じクエリ文字列が何度も保持されるという事実を尊重してください。たとえば、CashFlowSensitive フラグのみを「オン」にした場合、クエリの実行時にその特定のパラメーターをアクティブにする必要があります。他のパラメータは、フィルタリング プロセスに対してニュートラルな方法で動作する必要があります。それ以外の場合は、Sp1 フィールド (CHAR フィールド) をアクティブにすることを選択し、他のフィールドは休止状態にする必要があります。また、いくつかのフィールドの組み合わせを選択する場合もありますが、それらはアクティブで、選択されていないフィールドはニュートラルである必要があります。あなたの任務の範囲を縮小させてください。1) バインド パラメータを使用して CHAR フィールドをクエリする方法を教えてください。フィールドはフィルタリング プロセスでニュートラルにする必要があります。

4

1 に答える 1

1

問題は、else パスの 2 番目のパラメーターの値を渡すことです。最終的なクエリは次のようになります。

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

これは明らかにレコードを返しません。最初のパラメーターのみが必要な場合は、最初のパラメーターのみを照会する必要があります。何かのようなもの:

select * from helm.activitiesextended where CashFlowSensitive = 1
于 2013-05-30T00:48:58.000 に答える