如何使用StringTokenizer进行选择查询?

时间:2012-09-20 07:25:13

标签: java spring-mvc stringtokenizer

我正在尝试使用所选字段查询最终用户从视图(JSP)到控制器,但我不知道如何。

例如,我有来自view(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);

请帮助我

3 个答案:

答案 0 :(得分: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);

    }
  

注意:','替换为'_',运算符被'#'

包围

干杯!!

答案 1 :(得分:0)

我认为问题在于你的while循环中的这一行:

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

这将在while循环执行时不断更改myQuery的值。

也许您需要将其替换为:

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

我假设您的选择条件是您视图中参数中的第一个字段。

答案 2 :(得分:0)

看不到IDPERFIL来自哪里。另外,我不喜欢这个:

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

这会将tokenizer迭代到最后,并在最后一个元素处停止。我相信你不想要这个。解决这个问题,告诉IDPERFIL来自哪里,然后,也许,你会理解你自己的答案。否则,我会尽力帮助你。