当前位置: 首页 > 知识库问答 >
问题:

无计数查询的Spring Data JPA分页

宣星光
2023-03-14

根据Spring文档https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.special-返回List的参数不应发出计数查询。

但是随着我的Spring,它变得有点奇怪。

当使用page1运行页面请求时,它不需要计数查询,我认为这是正确的。

但当我使用页面2(或以上)调用存储库时,它突然在选择查询之后执行了一个计数查询,这是我没有预料到的。

有没有什么方法可以让计数查询不使用分页发出?

我所做的存储库和服务代码。

@Repository
public interface ArticleRepository extends CrudRepository<Article, Long> {
  // Slice was also tested and did issue count query from page 2
  List<Article> findAll(Pageable pageable);
} 

@Service
public class ArticleService {
  private final ArticleRepository articleRepository;

  @Autowired
  public ArticleService(
      ArticleRepository articleRepository) {
    this.articleRepository = articleRepository;
  }

  public List<Article> getArticles(int page) {
    PageRequest pageRequest = PageRequest.of(page, 50, Sort.by("createdAt").descending());
    return articleRepository.findAll(pageRequest);
  }
}

共有2个答案

高英彦
2023-03-14
  1. 您可以组合PagingAndSorting Repository和CrudRepository,因为它们都是接口或使用JpaRepository。
  2. 您可以通过将其设置为@Query注释来编写自己的计数查询。

在公共页面的源代码

if (content.size() != 0 && pageable.getPageSize() > content.size()) {
    return new PageImpl<>(content, pageable, pageable.getOffset() + content.size());
}
return new PageImpl<>(content, pageable, totalSupplier.getAsLong());

因此,您不能使用默认的存储库方法来避免它。在PagingAndSortingRepository类下指定您自己的jpa方法或声明查询注释。

柳向明
2023-03-14

如果您需要扩展CrudRepository,那么您将能够在存储库中使用Slice定义方法:

Slice<Article> findAll(Pageable pageable);

我认为另一个选择是将超级接口改为< code > PagingAndSortingRepository 。它可以解决使用< code>List返回的问题。

interface ArticleRepository extends PagingAndSortingRepository<Article, Long> {
    List<Article> findAll(Pageable pageable);
}
 类似资料:
  • 我想知道是否可以禁用查询类型,或者是否可以有用于筛选上下文? ES版本:6+ 例如: 此查询将搜索或中的匹配项,并进行得分计算 此查询将筛选在和中匹配的文档,并且不会进行分数计算。不是我需要的,因为它使用和 我的目标是排除相同查询的性能故障,有和没有分数。所以我有第一个有分数的查询。如何编写没有分数的第二个查询? 谢了。

  • 我们正在使用Spring Data JPA Repository。对于分页,我们将Pageable对象传递给JPA Repository findBy Methods。 因为在我们的UI中,我们不显示记录的总计数,所以我们不希望触发计数查询。有没有办法抑制分页期间触发的计数查询?

  • 在使用Micronaut数据执行显式查询(@query)时,是否可以给出一个countQuery示例来实现分页?在中没有示例https://micronaut-projects.github.io/micronaut-data/latest/guide/#explicitQueries 我必须提出一个如下的问题

  • SpringDataJpa中 Specification怎样使用in查询 实体类Menu.java如下 想通过roles属性做in查询,代码如下 错误如下: Parameter value [com.appmtce.pojo.entity.role.Role@20f81e2a] did not match expected type [java.util.Collection (n/a)] 我的S

  • 查询分数 查询分数。可供游戏场景使用。查询用户当前互动实例下的成就值。 /** * Tida.queryScore 获取游戏分数后的回调函数数据 * @param {Object} result 结果数据 * @param {number} result.errorCode 为0时成功 其它值失败 * @param {number} result.maxPoint 最大值(比如,最短时间)

  • 问题内容: 我想按数据库中的条件计数记录数。 我尝试使用下一个查询 但是没有方法可以执行此操作并获得结果。 我知道,我可以使用 所以问题是,查询是否具有更高的性能?如果,那么我该如何执行查询呢? 问题答案: 您可以通过调用来执行第一个查询,例如。 如果要将计数分配给变量,则需要将其转换为适当的类型(它可以取决于DB,但很可能是Long)。第二个查询效率很低,因为Hibernate需要从数据库中检索