我以前从未在Java工作,更不用说Apex了,而且数据库也不多,所以请原谅我,如果我犯了一些非常愚蠢的错误。
我正在使用VisualForce页面让我的组织的员工在多个记录的富文本字段中搜索关键字。 SOQL对于长文本字段不是很好,所以我使用SOSL。
用户转到VF页面的URI,并根据URI中的三个GET参数执行SOSL查询:and
,or
和not
。这可以让用户"保存"并与其他员工分享他们的搜索。 (是的,我将防止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]);
}
}
答案 0 :(得分:3)
Set
不保持排序。值似乎以相反的顺序出现的事实是巧合。您可以使用List
吗?