0

ビュー(JSP)からコントローラーまでの最終ユーザー用に選択したフィールドを使用してクエリを作成しようとしていますが、方法がわかりません。

たとえば、このパラメーターをビューから取得します(JSP)

IDUSER,>,2,OR,USERNAME,=,'KURT'

だから、こんなものが欲しいなぁ、

SELECT IDUSER, USERNAME FROM TABLE_NAME WHERE IDUSER > 2 OR USERNAME = 'KURT'

しかし、私は次の結果があります

SELECT null FROM TABLE_NAME WHERE IDUSER > 2 OR USERNAME = 'KURT'

私は文字列をStringTokenizerクラスで解析しています。ここで、クエリは:String query = request.getParameter("data");で、データはIDUSER,>,2,OR,USERNAME,=,'KURT'です。

StringTokenizer field = new StringTokenizer(query, ",");
nFields = field.countTokens();
System.out.println("nFields: " + nFields);
String[] fields = new String[nFields];
for(int i = 0; i < fields.length; i++) {
    while(field.hasMoreTokens()) {
         fields[i] = field.nextToken();
    }
    System.out.println("fields[i]: " + fields[i]);
    myQuery = "SELECT " + fields[i] + " FROM "+tableName+ " WHERE ";
    System.out.println("myQuery 1: " + myQuery);
}
StringTokenizer token= new StringTokenizer(query, "|,");
while(token.hasMoreTokens()) {
     myQuery = myQuery + token.nextToken() + " ";
}
System.out.println("QUERY RESOLVED: " + myQuery);

私を助けてください

4

3 に答える 3

1

クエリを微調整した後の解決策は次のとおりです(セパレータを再定義しました)

public static void main(String[] args) {
        // Redefine the separators as single , separators is difficult to process
        //You would need to define possible operators like this (#OR# , #AND# ) ,surrounded by special characters to identify.
        String query ="IDUSER_>_2#OR#USERNAME_=_'KURT'";
        String tableName="TESTTABLE";
        String operator=null;
        //you can choose operator conditionally
        if(query.contains("#OR#")) operator="#OR#";
//      if(query.contains("#AND#")) operator="#AND#";
        //Used split instead of Tokenizer.
        String cols[]= query.split(operator);
        String myQuery = "SELECT ";
        String select="";
        for(String col:cols){
            if(!select.isEmpty()){
                select+=" , ";
            }
            // Only the first element is retrieved (for select)
            select+=col.split("_")[0];
        }
        myQuery+=select+" FROM "+tableName+ " WHERE ";
        // Removes all special charecters (like,  # and _ with white space)
        String subQuery = query.replaceAll("#", " ");
        subQuery=subQuery.replaceAll("_", "");
        myQuery+=subQuery;
        System.out.println("QUERY RESOLVED: " + myQuery);

    }

注:「、」は「_」に置き換えられ、演算子は「#」で囲まれます

乾杯!!

于 2012-09-21T06:39:02.290 に答える
0

問題は、whileループのこの行にあると思います。

myQuery = "SELECT " + fields[i] + " FROM "+tableName+ " WHERE ";

myQueryこれにより、whileループの実行時にの値が変更され続けます。

たぶん、これを次のように置き換える必要があります。

myQuery = "SELECT " + fields[0] + " FROM "+tableName+ " WHERE ";
break;

私はあなたの選択基準があなたの視点からのパラメータの最初のフィールドであると仮定しています。

于 2012-09-20T07:45:23.457 に答える
0

どこから来たのかわからないIDPERFIL。また、私はこれが好きではありません:

while(field.hasMoreTokens()) {
     fields[i] = field.nextToken();
}

これにより、トークナイザーが最後まで繰り返され、最後の要素で停止します。私はあなたがこれを望まないと確信しています。それを修正し、IDPERFILがどこから来たのかを教えてください。そうすれば、おそらく、あなたは自分で答えを理解するでしょう。そうでなければ、私はさらに助けようとします。

于 2012-09-20T07:45:33.647 に答える