【问题标题】:Using dynamic query for spring mvc pagination使用动态查询进行spring mvc分页
【发布时间】:2015-12-03 14:00:48
【问题描述】:

我正在尝试在 spring mvc 中实现分页。

就我而言,我有一个 Review 实体,它由 reviewStatus 和它提交的 date 组成。

我正在尝试使用 JpaRepository,但我不确定如何使用它来支持以下搜索查询。

SELECT * from review WHERE review.reviewStatus = 2 AND 
  ( review.submittedOn BETWEEN '2015-09-08' AND '2015-09-09' )

我可以看到(参考http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/jpa.repositories.html)我们可以为特定查询定义方法,例如 findbyname。

但是,在我的例子中,如果用户不提供状态,那么上面的查询就变成了:

SELECT * from review WHERE ( review.submittedOn BETWEEN 
  '2015-09-08' AND '2015-09-09' )

如果没有提供提交日期,则变为

SELECT * from review WHERE review.reviewStatus = 2

简而言之,查询取决于最终用户输入的值,我希望使用相同的参数来实现分页。

请指导和/或分享链接以实施相同的操作。

提前致谢。

【问题讨论】:

  • 您的意思是根据用户传递的内容进行动态查询吗?是关于分页的问题还是关于构建查询的问题?你的问题的标题似乎有点混乱
  • @jmcg 实际上两者兼而有之。我第一次尝试使用分页进行动态查询。我使用了一个简单的“全选”查询,没有任何问题。但不确定如何执行动态查询并获得可以在正确分页中显示的结果

标签: java spring spring-mvc pagination spring-data-jpa


【解决方案1】:

看看http://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/PagingAndSortingRepository.html

您可以将 Pageable 对象传递给findAll 方法

http://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/Pageable.html

根据http://www.petrikainulainen.net/programming/spring-framework/spring-data-jpa-tutorial-part-seven-pagination/

public List<Person> search(String searchTerm, int pageIndex) {
    LOGGER.debug("Searching persons with search term: " + searchTerm);

    //Passes the specification created by PersonSpecifications class and the page specification to the repository.
    Page requestedPage = personRepository.findAll(lastNameIsLike(searchTerm), constructPageSpecification(pageIndex));

    return requestedPage.getContent();
}

/**
 * Returns a new object which specifies the the wanted result page.
 * @param pageIndex The index of the wanted result page
 * @return
 */
private Pageable constructPageSpecification(int pageIndex) {
    Pageable pageSpecification = new PageRequest(pageIndex, NUMBER_OF_PERSONS_PER_PAGE, sortByLastNameAsc());
    return pageSpecification;
}

【讨论】:

  • 我试着调查一下。但恐怕我无法获得所需的信息。可分页对象可用于设置顺序,但我不确定是否可以将其用于查询本身。如果您能提供示例,这样我就可以研究我目前无法理解的内容,这将是非常棒的。
  • 如何使用我在帖子中提到的查询?我已经完成了这个教程,因为它出现在谷歌搜索结果的第一页
【解决方案2】:

看看这个春天 mvc 分页:How to implement pagination in Spring MVC 3

对于您的动态查询,您可以使用Stringbuilder 根据用户输入构建您的查询。大致如下:

    pulic YourDomainObject searchDynamically(String reviewStatus, String date){
      StringBuilder sql = new StringBuilder();
      sql.append("SELECT * FROM review WHERE ");

      if(null != reviewStatus && null != date){
         sql.append(" reviewStatus = ? and date = ? ");

      }elseif(null != reviewStatus){
         sql.append(" reviewStatus = ? ");

      }elseif(null != date){
         sql.append(" date = ? ");
      }
    }

【讨论】:

    猜你喜欢
    • 2020-11-13
    • 2019-01-31
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2014-06-28
    • 2017-04-15
    相关资源
    最近更新 更多