为什么Apex在这个集合上向后迭代?

时间:2014-12-09 01:38:59

标签: java salesforce visualforce apex soql

我以前从未在Java工作,更不用说Apex了,而且数据库也不多,所以请原谅我,如果我犯了一些非常愚蠢的错误。

我正在使用VisualForce页面让我的组织的员工在多个记录的富文本字段中搜索关键字。 SOQL对于长文本字段不是很好,所以我使用SOSL。

用户转到VF页面的URI,并根据URI中的三个GET参数执行SOSL查询:andornot。这可以让用户"保存"并与其他员工分享他们的搜索。 (是的,我将防止SQL注入。)

例如:

https://abc123.visual.force.com/apex/myCustomController?and=bilbo,baggins&or=frodo,pippin,merry&not=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]);
    }

}

1 个答案:

答案 0 :(得分:3)

Set不保持排序。值似乎以相反的顺序出现的事实是巧合。您可以使用List吗?