Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用StringTokenizer进行选择查询?_Java_Spring Mvc_Stringtokenizer - Fatal编程技术网

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

Java 如何使用StringTokenizer进行选择查询?,java,spring-mvc,stringtokenizer,Java,Spring Mvc,Stringtokenizer,我正试图为最终用户创建一个从视图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

我正试图为最终用户创建一个从视图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.getParameterdata;数据是IDUSER,>,2,或者用户名,=,'KURT'


请帮助我

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

myQuery = "SELECT " + fields[i] + " FROM "+tableName+ " WHERE ";
这将在while循环执行时不断更改myQuery的值

也许您需要将其替换为:

myQuery = "SELECT " + fields[0] + " FROM "+tableName+ " WHERE ";
break;
我假设您的选择标准是您视图中参数的第一个字段。

不知道IDPERFIL来自何处。另外,我不喜欢这样:


这将迭代标记器到最后,并在最后一个元素处停止。我肯定你不想要这个。解决这个问题,告诉我IDPERFIL是从哪里来的,然后,也许你们会自己理解答案。否则,我将尝试进一步提供帮助。

这里是在您的查询中稍作调整后重新定义分隔符的解决方案

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);

    }
注:“,”替换为“\”,运算符用


干杯

您好,查询字符串是什么样子的?字符串query=IDUSER,>,2或,USERNAME,=,'KURT';这种方法容易受到SQL注入的影响。不要在面向公众的网站上使用它。列名和where子句在此查询中混淆。最好单独获取它们。不,用户final可以从视图JSPOK中选择1个或多个字段,那么您如何决定用户可以选择什么以及约束应该是什么?也就是说,您如何找到SELECT后面的内容以及WHERE后面的内容?请参阅Thor84no对上述原始问题的评论。他想要的查询实际上包括两个列名,但他没有任何可用的信息显示,应该是两个,必须从他神奇字符串中的列名推断出来。假设这些列是可变的,则需要查找可能的列名列表并计算字段数,然后正确地包含它们。
while(field.hasMoreTokens()) {
     fields[i] = field.nextToken();
}
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);

    }