我正在尝试使用所选字段查询最终用户从视图(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);
请帮助我
答案 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来自哪里,然后,也许,你会理解你自己的答案。否则,我会尽力帮助你。