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

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

用户转到VF页面的URI,并根据URI中的三个GET参数(andornot)执行SOSL查询。这使用户可以“保存”并与其他员工共享搜索。 (是的,我将防止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]);
    }

}

最佳答案

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

10-07 15:24