Java中用于查找的分页

Java中用于查找的分页,java,mongodb,Java,Mongodb,我正试图在一个已经运行的应用程序中实现分页,它的工作原理类似于mongodb,在mongodb中,您可以得到一个带有大量参数的查询,如 搜索条件、限制(需要多少文档)、跳过(跳过这些文档) 等等 响应返回json,我的任务是生成指向查询的上一页和下一页链接,这意味着根据查询生成上一页和下一页 我想出了下面的方法 public Paging generateLink(RequestFilter filter) { int prev_skip; int prev_limit;

我正试图在一个已经运行的应用程序中实现分页,它的工作原理类似于mongodb,在mongodb中,您可以得到一个带有大量参数的查询,如

搜索条件、限制(需要多少文档)、跳过(跳过这些文档) 等等

响应返回json,我的任务是生成指向查询的上一页和下一页链接,这意味着根据查询生成上一页和下一页

我想出了下面的方法

  public Paging generateLink(RequestFilter filter) {
    int prev_skip;
    int prev_limit;
    String pagePrev = "";
    String pageNext = "";
    int next_skip;
    int next_limit;
    String searchCondition = JsonUtils.toSimpleJsonString(filter.getSearch());
    String url = "http://isgswmdi1n1.nam.nsroot.net:7014/account-search/rest/api/v1/pmm";
            //properties.getProperty("paging.link");
    System.out.println(url);
    Paging pagingOption = new Paging();
    Result result = new Result();
    int count = luceneSearchService.searchCount(filter);
    try {
        if (count > 1) {

            if (filter.getSkip() > 0) {
                prev_skip = Math.max((filter.getSkip() - 1), 0);
                prev_limit = filter.getLimit();

                pagePrev = url + "?search=" + searchCondition + "&skip=" + prev_skip + "$limit=" + prev_limit;
            } else{
                result.setPaging(null);
                return null;
            }
            if (count > (filter.getLimit() + filter.getSkip())) {
                next_skip = (filter.getSkip() + filter.getLimit());
                next_limit = filter.getLimit();
                pageNext = url + "?search=" + searchCondition + "&skip=" + next_skip + "$limit=" + next_limit;
            } else{
                result.setPaging(null);
                return null;
            }

            pagingOption.setPagePrev(pagePrev);
            pagingOption.setPageNext(pageNext);


            result.setPaging(pagingOption);

        }
        return pagingOption;

    } catch (NullPointerException n)

    {
        n.printStackTrace();
        return pagingOption;
    }
}
调用generateLink方法

 return Result.ok(resultRow, generateLink(filter));
结果类中的ok响应方法

public static Result ok(List<ResultRow> resultRows, Paging paging) {
        if (paging != null) {
            return new Result(resultRows, 200, "Completed", paging);
        } else
            return new Result(resultRows, 200, "Completed");
    }
但是我的测试方法失败了

@Test
public void search_allFilterParamsAreDefined_hp() throws Exception {
    // given
    Map<String, Serializable> searchConditions = singletonMap("shortName", "GO");
    List<String> returnFields = asList("shortname", "gfcid");
    String returnFieldsStr = returnFields.stream().collect(joining(","));
    RequestFilter filter = RequestFilter.create(searchConditions, returnFieldsStr, 5, 10, true);

    int resultSize = 20;
    List<ResultRow> searchResult = getSearchResult(resultSize);
    when(luceneSearchService.search(filter)).thenReturn(searchResult);
    when(luceneSearchService.searchCount(filter)).thenReturn(resultSize);

    // do
    Result result = searchCoordinator.search(filter);

    // verify
    assertEquals(searchResult, result.getRows());

    assertReturnFields(returnFields, result.getRows());

    assertNotNull(result.getPaging());

    Map<String, String> nextParams = getQueryParams(result.getPaging().getPageNext());
    assertParam(nextParams, "search", toSimpleJsonString(searchConditions));
    assertParam(nextParams, "skip", "15");
    assertParam(nextParams, "limit", "10");
}
@测试
public void search_allfilterParamsRedefined_hp()引发异常{
//给定
Map searchConditions=singletonMap(“shortName”,“GO”);
List returnFields=asList(“简称”、“gfcid”);
字符串returnFieldsStr=returnFields.stream().collect(连接(“,”);
RequestFilter=RequestFilter.create(searchConditions,returnFieldsStr,5,10,true);
int resultSize=20;
List searchResult=getSearchResult(resultSize);
当(luceneSearchService.search(filter)),然后返回(searchResult);
当(luceneSearchService.searchCount(filter)),然后返回(resultSize);
//做
结果=searchCoordinator.search(过滤器);
//核实
assertEquals(searchResult,result.getRows());
assertReturnFields(returnFields,result.getRows());
assertNotNull(result.getPaging());
Map nextParams=getQueryParams(result.getPaging().getPageNext());
assertParam(nextParams,“搜索”,toSimpleJsonString(搜索条件));
资产参数(下一个图表,“跳过”、“15”);
资产参数(下一个图表,“限额”、“10”);
}

你能提供你得到的异常堆栈跟踪吗?嗨,Lex,我正在运行测试,这是我得到的错误测试:search_onlyneResultPage_nopage(com.citi.ddi.esales.as.rest.facade.SearchCoordinatorTest)没有异常跟踪你能提供你得到的异常堆栈跟踪吗?嗨,莱克斯,我正在运行测试,这是我得到的错误测试:search_onlyneresultpage_nopage(com.citi.ddi.esales.as.rest.facade.searchCoordinatorest)没有异常跟踪
@Test
public void search_allFilterParamsAreDefined_hp() throws Exception {
    // given
    Map<String, Serializable> searchConditions = singletonMap("shortName", "GO");
    List<String> returnFields = asList("shortname", "gfcid");
    String returnFieldsStr = returnFields.stream().collect(joining(","));
    RequestFilter filter = RequestFilter.create(searchConditions, returnFieldsStr, 5, 10, true);

    int resultSize = 20;
    List<ResultRow> searchResult = getSearchResult(resultSize);
    when(luceneSearchService.search(filter)).thenReturn(searchResult);
    when(luceneSearchService.searchCount(filter)).thenReturn(resultSize);

    // do
    Result result = searchCoordinator.search(filter);

    // verify
    assertEquals(searchResult, result.getRows());

    assertReturnFields(returnFields, result.getRows());

    assertNotNull(result.getPaging());

    Map<String, String> nextParams = getQueryParams(result.getPaging().getPageNext());
    assertParam(nextParams, "search", toSimpleJsonString(searchConditions));
    assertParam(nextParams, "skip", "15");
    assertParam(nextParams, "limit", "10");
}