我以前从未在Java中工作过,更不用说Apex了,数据库方面的工作也不多,所以请原谅我犯了一些非常愚蠢的错误。
我正在使用VisualForce页面,以使组织中的工作人员可以在多条记录的富文本字段中搜索关键字。 SOQL对于长文本字段不是很好,所以我正在使用SOSL。
用户转到VF页面的URI,并根据URI中的三个GET参数(and
,or
和not
)执行SOSL查询。这使用户可以“保存”并与其他员工共享搜索。 (是的,我将防止SQL注入。)
例如:
https://abc123.visual.force.com/apex/myCustomController?and=bilbo,baggins&or=frodo,pippin,merry¬=sauron
那应该产生:
FIND '(bilbo* AND baggins*) OR (frodo* OR pippin* OR merry*) AND NOT (sauron*)'...
相反,我得到这个:
FIND 'AND NOT (sauron*) OR (frodo* or pippin* or merry*)(bilbo* and baggins*)'...
urlParamTypes
设置以相反的字母顺序不断循环遍历最外面的for
循环。我尝试排序,尝试以相反的顺序编写它,但没有任何效果。否则,事情似乎进展得非常好,所以令人沮丧的是,我遇到的麻烦似乎太愚蠢了。
非常感谢您的想法!
Public with sharing class myController{
Public Map<String, String> urlParams {get; set;}
Public Set<String> urlParamTypes = new Set<String>{'and','or','not'};
Public String queryString {get; set;}
Public List<myCustomObject> candidates {get; set;}
Public myController(){
urlParams = ApexPages.currentPage().getParameters();
Integer totalParamTypes = urlParams.size();
Integer intOfParamTypes = 0;
for(String thisParamType : urlParamTypes){
String thisParamString = urlParams.get(thisParamType);
Integer intOfThisParamType = 0;
Integer totalOfThisParamType = 0;
if(thisParamString != null && thisParamString.length() > 0){
intOfParamTypes++;
if(thisParamType == 'or' && intOfParamTypes > 0){
queryString += ' OR ';
}else
if(thisParamType == 'not' && intOfParamTypes > 0){
queryString += ' AND NOT ';
}
queryString += '(' + thisParamString.replace(',', '* ' + (thisParamType == 'not' ? 'AND' : thisParamType) + ' ') + '*)';
}
}
queryString = 'FIND \'' + queryString + '\' RETURNING myCustomObject (id,name)';
List<List <myCustomObject>> searchList = search.query(queryString);
candidates = ((List<sObject>)searchList[0]);
}
}
最佳答案
Set
不保持排序。值似乎以相反的顺序出现的事实是巧合。您可以改用List
吗?