在Java中进行分页以进行查找

时间:2016-02-11 18:50:26

标签: java mongodb

我正在尝试在已经运行的应用程序中实现分页,它的工作方式与mongodb类似,您可以在其中获得带有大量参数的查询,例如

searchConditions,限制(您想要多少个文档),跳过(跳过这些文档) 等等

并且响应返回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));

Result类

中的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");
    }

底层分页类

public class Paging implements Serializable {

        public String getPagePrev() {
            return pagePrev;
        }

        public void setPagePrev(String pagePrev) {
            this.pagePrev = pagePrev;
        }

        @JsonProperty("pagePrev")
        private String pagePrev;

        public String getPageNext() {
            return pageNext;
        }

        public void setPageNext(String pageNext) {
            this.pageNext = pageNext;
        }

        @JsonProperty("pageNext")
        private String pageNext;
    }

但我的测试方法失败了

@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");
}

0 个答案:

没有答案